Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 蓝知更鸟的承诺。一切都不';我没接到电话_Javascript_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript 蓝知更鸟的承诺。一切都不';我没接到电话

Javascript 蓝知更鸟的承诺。一切都不';我没接到电话,javascript,node.js,promise,bluebird,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, jso

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

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

Bluebird还提供了一个帮助器,使使用阵列更容易

在整个链中放弃所有回调并返回承诺会给您带来类似(未经测试)的结果:

请求承诺将为您执行2XX检查,除非您设置了


它也只解析请求的
正文
,除非您将
resolveWithFullResponse
设置为
true
,比如说如果您想对响应的状态代码进行更复杂的检查。

您真的是说
承诺。所有
都不会被调用,或者它确实被调用,但是
然后
回调没有运行?对于
body
url
在您的上添加一个错误处理程序。然后,为了看看会发生什么……看在上帝的份上,停止使用
for/in
来迭代数组。使用传统的
for
循环、
.forEach()
for/of
都是为数组构建的。您所做的是为迭代对象的属性而构建的,该对象将包括数组条目,但也可以包括其他属性。我认为使用
rp
的全部意义在于您使用
。然后()
,并且不向其传递回调!你试图以某种方式使用一个混合的一点每一个。那太糟糕了。请求承诺不接受回调作为参数。它只是返回一个promise。代码通常是有效的,但是由于某种原因,“完成的所有”部分在运行/打印之前:/finished all部分似乎需要在
promise.map
部分上。所以我将把这个标记为已解决。谢谢奇怪的是,将
.then()
直接附加到
Promise.map
应该与将
.then()
附加到
Promise.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)
})