PromiseJS中的延期承诺

时间:2016-04-16 21:21:37

标签: javascript node.js

我有一个数组,我循环创建每个的承诺,然后将承诺添加到另一个承诺数组。然后我将这些承诺传递给Promise.all并等待它们完成。我想要做的是为每个延迟添加一个延迟,以便延迟执行。

这是我的代码:

function updateStatus(message) {
    return new Promise(function(fulfill, reject) {
        var params = { status: message };
        twitter.post('statuses/update', params, function(error, tweet, response) {
            if(error) reject(error);
            else fulfill(tweet);
        });
    });
}

这是我的承诺。稍后我会遍历一系列促销并将它们添加到promises数组中:

fetchPromotions.then(function(promotions) {

    var promises = [];

    for(var i=0; i < promotions.length; i++) {
        promises.push(updateStatus(promotion[i].text));
    }

    return Promise.all(promises);
}).then(...);

然后我等待他们使用Promise.all()完成。

我想做的是为每个承诺添加延迟。所以第一次运行,第二次运行1分钟,第二次运行2分钟等等。

PromiseJS可以实现吗?

2 个答案:

答案 0 :(得分:3)

您可以使用 setTimeout 功能为每个承诺设置延迟。

function generate(delay, id) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`Promise ${id} with ${delay} delay`);
    }, delay);
  });
}

const promises = [];

for (let i = 0; i < 5; ++i) {
  promises.push(generate(i * 1000, i));
}

//Wait 4s because it's the longest timer
Promise.all(promises).then((data) => console.log(data));

答案 1 :(得分:0)

您是否尝试使用setTimeout

function updateStatus(message) {
    return new Promise(function(fulfill, reject) {
        setTimeout(function(){
            var params = { status: message };
            twitter.post('statuses/update', params, function(error, tweet, response) {
                if(error) reject(error);
                else fulfill(tweet);
            });
        }, YOUR_DELAY);

    });
}

<强>增加:

您可以创建一个延迟函数,该函数返回一个返回promise的函数。因此,您可以使用then链上的延迟参数调用此函数:

  function delay(delayInMs){
      return function (){
          return new Promise(function(resolve, reject){setTimeout(resolve,delayInMs);});
      }  
  }