2016-04-16 59 views
1

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

这里是我的代码:

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); 
     }); 
    }); 
} 

那是我的承诺。后来我遍历促销阵列,并将它们添加到一个承诺阵列:

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可以吗?

回答

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)); 
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); 

    }); 
} 

新增:

您可以创建一个返回,返回一个承诺的功能延迟功能。所以,你可以在then链调用与延迟参数此功能:

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

Node.js,没有'window'对象。 – alexmac

+0

删除'窗口' – ykaragol

+1

我是一种希望PromiseJS有一个解决方案。我会尝试一下,我需要将'delay'传递给函数,因为它们有不同的时间。 – BugHunterUK