Javascript 蓝知更鸟的承诺。一切都不';我没接到电话
我有一个返回其他url列表的url 对于每个url,我想做一些事情,然后使用Promise.all告诉我它完成了 出于某种原因,它确实会处理所有URL,但是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
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)
})