javascript - Bluebird Promise.all 没有被调用

标签 javascript node.js promise bluebird

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

由于某种原因,它确实处理了所有 url,但 Promise.all 似乎没有被调用 (Bluebird)

我做错了什么?

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");
   });
  }
 }
);

最佳答案

无需在 request-promise 库中使用回调,示例代码是原始请求回调 API 和 request-promise API 的混合体。

Bluebird 还有一个.map使使用数组更容易的帮助器。

在整个链中删除所有回调并返回 promise 会给你带来类似(未经测试)的结果:

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)
})

request-promise 将为你做 2XX 检查,除非你设置 simple request option to false .

它也只会解析请求的body,除非您将resolveWithFullResponse设置为true,比如您想进行更复杂的检查关于响应的状态代码。

关于javascript - Bluebird Promise.all 没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43172598/

相关文章:

javascript - 在 React Native 中加载 ActivityIndi​​cator 时如何禁用触摸屏?

javascript - 合并来自两个数组的值

javascript - 调试 AJAX 请求

javascript - 无法在 es6 类中设置未定义的属性 'value'

javascript - 如何在 Angular JS 中使用 ng-model 将文本框值发送到 Controller

Javascript 十六进制到 Base32 编码

node.js - 无法读取未定义的属性 'then',bcrypt.hash()

javascript - 使用自定义错误退出/违背 promise

javascript - Promise then 和 catch 条款不起作用

javascript - 手机号码的正则表达式使括号作为国家代码的可选,破折号、点和空格是可选的