如何在循环中的每个请求 - 承诺api调用之前添加一个短的超时

时间:2017-05-14 04:19:33

标签: node.js promise

所以我是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
                });

2 个答案:

答案 0 :(得分:2)

没有蓝鸟

没有蓝鸟但仍在寻找Promise.delay的人可以轻松实现简单的延迟承诺

&#13;
&#13;
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;
&#13;
&#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}}转到下一次迭代,直到延迟完成。