通过超时解决一系列承诺。 Promise.all [英] Resolve a chain of promises with timeouts. Promise.all
本文介绍了通过超时解决一系列承诺。 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);
}
}
});
});
}
我需要为数据库中的每个项目请求数据。所以,我为此创建了一系列承诺。
I need to request data for each item in database. So, I created a chain of promises for that.
我正在请求具有5秒冷却时间的api数据。所以,我需要等待5秒才能解决 Promise.all(承诺)中的下一个承诺。
I am requesting data of an api that has 5 sec of cooldown. So, I need wait 5 sec until resolve next promise in Promise.all(promises).
如何在Promise.all中的每个承诺之间设置setTimeout?
How Can I setTimeout between each promise in Promise.all ?
推荐答案
你需要在你的循环中创建 Promise
链
You need to create Promise
chain in your loop
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});
};
运行示例
const getPrice = function (database) {
var promisesChain = Promise.resolve();
var todos = [];
for (var i in database) {
promisesChain = promisesChain.then(((i) => () => {
return Update.requestClassifieds(database[i])
})(i)).then((res) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
todos.push(res);
resolve();
console.log('resolve', res);
}, 1000);
});
})
}
return promisesChain.then(() => {return todos});
};
const Update = {};
Update.requestClassifieds = function (i) {
console.log('got', i);
return new Promise((resolve, reject) => {
resolve(i)
});
}
getPrice({
a: 'A',
b : 'B',
c : 'C'
}).then(console.log);
这篇关于通过超时解决一系列承诺。 Promise.all的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文