2017-10-06 2 views
1

Ich habe das.Lösen Sie eine Kette von Versprechen mit Timeouts. Promise.all

const getPrice = function(database){ 
    return new Promise(function (resolve, reject){ 
     var promises =[]; 
     for(var i in database){ 
      promises.push(Update.requestClassifieds(database[i])) 
     } 
    Promise.all(promises) 
     .then(function(todos){ 
      return resolve(todos); 
     }) 
})} 

Update.prototype.requestClassifieds = function(item){ 
    var ithis = this; 
    return new Promise((resolve, reject) => { 
     var input = {}; 
     request({ 
      url: '', 
      method: "GET", 
      json: true, 
      body: input 
    }, function (error, response, body){ 
    if (error){ 
     return resolve(item); 
    } 
    else if(body){ 
     return resolve(item); 
    } 
    } 
}); 
}); 
} 

Ich muss Daten für jedes Element in der Datenbank anfordern. Also habe ich eine Kette von Versprechen dafür geschaffen.

Ich fordere Daten einer API, die 5 Sek. Abklingzeit hat. Also, ich brauche 5 Sekunden warten, bis nächsten Versprechen in Promise.all (Versprechen) zu lösen.

Wie kann ich Timeout zwischen jedem Versprechen in Promise.all festlegen?

+0

Es ist eine schlechte Idee zu schaffen, eine Frage, warum Sie zu einem 5 Sekunden Countdown müssen zwischen Versprechen? irgendetwas über den Datenbankzugriff? – Kalamarico

+0

@Kalamarico Api, dass ich 5 Sek. Abklingzeit habe. –

Antwort

0

Sie benötigen Promise Kette in der Schleife

const getPrice = function (database) { 
    var promisesChain = Promise.resolve(); // Promise chain 
    var todos = []; // results to be stored 
    for (var i in database) { 
     promisesChain = promisesChain.then(((i) =>() => { // create closure to grab database[i] 
      return Update.requestClassifieds(database[i]) 
     })(i)).then((res) => { 
      return new Promise((resolve, reject) => { 
       setTimeout(() => { // store result of requestClassifieds and resolve after 5sec 
        todos.push(res); 
        resolve(); 
       }, 500); 
      }); 
     }) 
    } 
    return promisesChain.then(() => {return todos}); 
}; 

Lauf Beispiel

const getPrice = function (database) { 
 
\t var promisesChain = Promise.resolve(); 
 
\t var todos = []; 
 
\t for (var i in database) { 
 
\t \t promisesChain = promisesChain.then(((i) =>() => { 
 
\t \t \t return Update.requestClassifieds(database[i]) 
 
\t \t })(i)).then((res) => { 
 
\t \t \t return new Promise((resolve, reject) => { 
 
\t \t \t \t setTimeout(() => { 
 
\t \t \t \t \t todos.push(res); 
 
\t \t \t \t \t resolve(); 
 
      console.log('resolve', res); 
 
\t \t \t \t }, 1000); 
 
\t \t \t }); 
 
\t \t }) 
 
\t } 
 
\t return promisesChain.then(() => {return todos}); 
 
}; 
 
const Update = {}; 
 
Update.requestClassifieds = function (i) { 
 
\t console.log('got', i); 
 
\t return new Promise((resolve, reject) => { 
 
\t \t resolve(i) 
 
\t }); 
 
} 
 
getPrice({ 
 
\t a: 'A', 
 
\t b : 'B', 
 
\t c : 'C' 
 
}).then(console.log);

+0

Ich denke, das ist die beste Lösung. Eine Frage: Wenn ich will, dass getPrice die Ergebnisse als Array zurückgibt, weil ich sie verwenden möchte. Nur ich muss das tun in "proventsChain.then (function() { console.log (todos);// Ergebnisse anzeigen})" –

+0

Ändern 'verheißenChain.then (function() {console.log (todos); // Ergebnisse anzeigen}) 'to' promisesChain.then (() => {return todos}); 'so' getPrice' gibt 'Promise' zurück, das mit einem Array von Ergebnissen aufgelöst wird –

+0

@TomasGonzalez siehe aktualisierte Antwort –

Verwandte Themen