【发布时间】: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回调没有运行? -
Don't use
for…inenumerations on arrays!body和urls -
在你的 .then 上添加一个错误处理程序,看看会发生什么......
-
看在上帝的份上,停止使用
for/in来迭代数组。使用传统的for循环、.forEach()或for/of,所有这些都是为数组构建的。您所做的是为迭代对象的属性而构建的,该对象将包括数组条目,但也可以包括其他属性。 -
我认为使用
rp的全部意义在于您使用.then()并且不要将其传递给回调!您正试图以某种方式使用每种的混合。那很糟。 request-promise 不接受回调作为参数。它只是返回一个承诺。
标签: javascript node.js promise bluebird