Bluebird Promise.all没有被调用

时间:2017-04-02 19:27:02

标签: javascript node.js promise bluebird

我有一个返回其他网址列表的网址 对于每个网址,我想做一些事情,然后使用Promise.all告诉我它完成了。

出于某种原因,它会处理所有网址,但Promise.all似乎没有被调用(蓝鸟)

我做错了什么?

var rp = require("request-promise");
var Promise = require("bluebird");

var promrequests = [];
rp(
 {
  url: url_of_list_of_urls,
  json: true,
 },
 function(error, response, body) {
  if (!error && response.statusCode === 200) {
   let urls = [];
   for (var i in body) {
    urls.push(body[i]);
   }

   for (let j in urls) {
    let url = urls[j];

    promrequests.push(
     rp(
      { url: url, followAllRedirects: true },
      function(error, response, body) {
       console.log("working on " + url);
       // do stuff
      }
     )
    );
   }

   Promise.all(promrequests).then(function() {
    console.log("finished all");
   });
  }
 }
);

1 个答案:

答案 0 :(得分:1)

不需要对request-promise库使用回调,示例代码是原始请求回调API和请求承诺API的混合。

Bluebird还有一个.map帮助程序,可以更轻松地处理数组。

删除所有回调并在整个链中返回promises会给你一些(未经测试的):

requestOptionsUrls = {
  url: url_of_list_of_urls,
  json: true,
}
rp(requestOptionsUrls).then(function(urls){
  return Promise.map(urls, function(url){
    return rp({ url: url, followAllRedirects: true })
      .then(function(body){
        console.log("working on " + url);
        // work
      })
  })
})
.then(function(){
  console.log("finished all");
})
.catch(function(error){
  console.error(error)
})

请求承诺将为您执行2XX检查,除非您设置simple request option to false

除非您将body设置为resolveWithFullResponse,否则它也只会解析请求的true,例如,您是否要对响应的状态代码执行更复杂的检查。< / p>