【问题标题】:Bluebird Promise.all doesn't get calledBluebird Promise.all 没有被调用
【发布时间】:2017-04-03 06:07:34
【问题描述】:

我有一个返回其他 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");
   });
  }
 }
);

【问题讨论】:

  • 你的意思是Promise.all 没有被调用,还是它被调用但then 回调没有运行?
  • 在你的 .then 上添加一个错误处理程序,看看会发生什么......
  • 看在上帝的份上,停止使用for/in 来迭代数组。使用传统的for 循环、.forEach()for/of,所有这些都是为数组构建的。您所做的是为迭代对象的属性而构建的,该对象将包括数组条目,但也可以包括其他属性。
  • 我认为使用rp 的全部意义在于您使用.then() 并且不要将其传递给回调!您正试图以某种方式使用每种的混合。那很糟。 request-promise 不接受回调作为参数。它只是返回一个承诺。

标签: javascript node.js promise bluebird


【解决方案1】:

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

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

在整个链中删除所有回调并返回承诺会给你类似(未经测试)的东西:

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,比如如果您想对响应的状态代码进行更复杂的检查。

【讨论】:

  • 代码通常可以工作,但由于某种原因,“全部完成”部分在其他所有内容之前运行/打印:/
  • 似乎完成的所有部分需要在Promise.map 部分上。所以我会将此标记为已解决。谢谢!
  • 这很奇怪,将.then() 直接附加到Promise.map 应该与将.then() 附加到来自Promise.map 的返回值相同。他们都应该等待里面所有值的解析。
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多