2017-10-06 7 views
1

J'ai ceci.Résolvez une chaîne de promesses avec des délais d'expiration. 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); 
    } 
    } 
}); 
}); 
} 

J'ai besoin de demander des données pour chaque élément dans la base de données. Donc, j'ai créé une chaîne de promesses pour cela.

Je demande des données d'un API qui a 5 sec de cooldown. Donc, j'ai besoin d'attendre 5 secondes avant de résoudre la promesse suivante en Promise.all (promet).

Comment puis-je définir setTimeout entre chaque promesse dans Promise.all?

+0

C'est une mauvaise idée, une question, pourquoi vous avez besoin d'un compte à rebours de 5 secondes entre promesses? quelque chose sur l'accès à la base de données – Kalamarico

+0

@Kalamarico Api que Im utilisant a 5 sec de cooldown. –

Répondre

0

Vous devez créer la chaîne Promise dans votre boucle

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

exemple Exécution

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

Je pense que c'est la meilleure solution. Une question: Si je veux que getPrice retourne les résultats en tableau parce que je veux les utiliser. Juste je dois faire cela dans "promisesChain.then (function() { console.log (todos); // afficher les résultats })" –

+0

Modifier 'promisesChain.then (function() {console.log (todos); // afficher les résultats}) 'à' promisesChain.then (() => {return todos}); 'donc' getPrice' retournera 'Promise' qui résout avec un tableau de résultats –

+0

@TomasGonzalez voir la réponse mise à jour –