2016-04-16 8 views
1

Ich habe ein Array, das ich durchlaufen durch Erstellen eines Versprechens für jedes einzelne, und fügen Sie dann das Versprechen zu einem anderen Array von Versprechen. Ich gebe diese Versprechen dann an Promise.all weiter und warte darauf, dass sie abgeschlossen werden. Was ich tun möchte, ist eine Verzögerung zu jedem hinzufügen, so dass ihre Ausführung zurückgestellt wird.Zurückgestellte Versprechen in PromiseJS

Hier ist mein Code:

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

Das ist mein Versprechen. Später ich Schleife durch eine Reihe von Aktionen und fügen Sie sie zu einem Versprechen Array:

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

ich dann warten, bis sie mit Promise.all() abzuschließen.

Was ich tun möchte, ist eine Verzögerung zu jedem Versprechen hinzuzufügen. So läuft die erste sofort, die zweite 1 Minute später, die dritte 2 Minuten später etc.

Ist das mit PromiseJS möglich?

Antwort

3

Sie die Funktion SetTimeout können für jedes Versprechen, eine Verzögerung einzustellen.

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

Haben Sie versucht, setTimeout zu verwenden?

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

    }); 
} 

ZUSÄTZLICH:

Sie können eine Verzögerungsfunktion erstellen, die eine Funktion zurückgibt, die ein Versprechen zurückgibt. So können Sie diese Funktion mit Delay-Parameter rufen bei then Ketten:

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

Node.js, hat kein 'window' Objekt. – alexmac

+0

entfernt 'Fenster' – ykaragol

+1

Ich hoffte irgendwie, dass PromiseJS eine Lösung hatte. Ich werde es versuchen, aber ich würde "Verzögerung" in die Funktion geben müssen, da sie unterschiedliche Zeiten haben. – BugHunterUK