所以我是Promise的新手,我想用Promise做多个url调用。现在似乎该算法有效,但问题是暴乱api有速率限制,所以我必须让程序在每次api调用后等待一小段时间。我该如何添加?
var matchidList = [];
for (var i = 0; i < pml.length; i++) {
matchidList.push(pml[i]["gameId"]);
}
var matchuri = "https://na1.api.riotgames.com/lol/match/v3/matches/";
var uris = [];
for (var i = 0; i < matchidList.length; i++) {
uris.push(matchuri + matchidList[i] + "?" + apikey);
}
Promise.map(uris, function(url) {
return rp.getAsync(url).spread(function(response,body) {
return JSON.parse(body);
});
}).then(function(results) {
// results is an array of all the parsed bodies in order
console.log(results);
tag.checkTags("").then((tags) =>{
res.render('index', { result: body,
val: search,
matches: ''
});
});
}).catch(function(err) {
console.log(err);
// handle error here
});
答案 0 :(得分:2)
没有蓝鸟
没有蓝鸟但仍在寻找Promise.delay
的人可以轻松实现简单的延迟承诺
Promise.delay = (ms, x) =>
new Promise(r => setTimeout(r, ms, x))
const logp = p =>
p.then(console.log, console.error)
logp(Promise.delay(3000, 'a'))
logp(Promise.delay(2000, 'b'))
logp(Promise.delay(1000, 'c'))
// c
// b
// a
&#13;
答案 1 :(得分:1)
由于您似乎正在使用Bluebird,因此您可以使用Promise.map()
的并发设置,并且可以使用Promise.delay()
:
Promise.map(uris, function(url) {
return rp.getAsync(url).spread(function(response,body) {
return Promise.delay(200, JSON.parse(body));
});
}, {concurrency: 1}).then(...);
并发设置会使Promise.map()
一次只运行一个请求,而Promise.delay()
会将延迟承诺链接到rp.getAsync()
,以便Promise.map()
赢得“{1}}转到下一次迭代,直到延迟完成。