【问题标题】:How to add a short Timeout before each request-promise api call in a loop如何在循环中的每个请求承诺 api 调用之前添加一个短超时
【发布时间】:2017-05-14 04:19:33
【问题描述】:

所以我是 Promise 的新手,我想使用 Promise 进行多个 url 调用。现在看来算法可行,但问题是 riot 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
                });

【问题讨论】:

    标签: node.js promise


    【解决方案1】:

    没有蓝鸟

    那些没有蓝鸟但仍在寻找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

    【讨论】:

    • 这只是部分答案,因为仅此一项并不能解决 OP 的问题。
    【解决方案2】:

    由于您使用的是 Bluebird,您可以使用 Promise.map()s 并发设置,也可以使用 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() 在延迟完成之前不会进入下一次迭代.

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2019-11-19
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多