javascript – ES6承诺超时间隔

我正在尝试将我的一些代码转换为承诺,但我无法弄清楚如何在承诺中链接新的承诺.

我的promise函数应该每隔一秒左右检查一个数组的内容,如果里面有任何项目应该解决.否则它应等待1秒并再次检查,依此类推.

function get(){
    return new Promise((resolve) => {

      if(c.length > 0){
        resolve(c.shift());

      }else{
        setTimeout(get.bind(this), 1000);
      }

    });

}


let c = [];

setTimeout(function(){
  c.push('test');
}, 2000);

这是我期望我的get()promise函数工作的方式,它应该在最多2或3秒后打印“test”:

get().then((value) => {
  console.log(value);
});

显然它不起作用,什么都没有打印

解决方法:

setTimeout本身具有可怕的链接和错误处理特性,所以总是wrap it

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

function get(c) {
  if (c.length) {
    return Promise.resolve(c.shift());
  }
  return wait(1000).then(() => get(c)); // try again
}

let c = [];
get(c).then(val => console.log(val));
wait(2000).then(() => c.push('test'));

虽然你没有问,为了别人的利益,这是async / await闪耀的一个很好的例子:

const wait = ms => new Promise(r => setTimeout(r, ms));

async function get(c) {
  while (!c.length) {
    await wait(1000);
  }
  return c.shift();
}

let c = [];
get(c).then(val => console.log(val));
wait(2000).then(() => c.push('test'));

注意这次我们不需要Promise.resolve(),因为异步函数隐式执行此操作.

相关文章

最后的控制台返回空数组.控制台在ids.map函数完成之前运行va...
我正在尝试将rxJava与我已经知道的内容联系起来,特别是来自J...
config.jsconstconfig={base_url_api:"https://douban....
我正在阅读MDN中的javascript,并且遇到了这个谈论承诺并且不...
config.jsconstconfig={base_url_api:"https://douban....
这是我的代码main.cpp:#include<string>#include<...