【发布时间】:2018-02-07 04:43:44
【问题描述】:
在 node.js 中,我尝试遍历一些项目,为每个项目完成一个异步过程,然后等待每个项目完成,然后再开始下一个项目。我一定是做错了什么,因为 Promise.all() 没有等待任何异步进程完成!我的代码如下:
getChildLessons() {
return new Promise((resolve, reject) => {
Promise.all(
//nested for loop is needed to get all information in object / arrays
this.lessons.levels.map((item, i) => {
item.childlevels.map((childItem, iChild) => {
return ((i, iChild) => {
//return async process with Promise.resolve();
return this.horseman
.open(childItem.url)
.html()
.then((html) => {
//adding some information to an array
})
.then(() => {
return Promise.resolve();
}).catch((err) => {
reject(err);
});
})(i, iChild);
});
})
// Promise.all().then()
).then(() => {
resolve(this.lesson);
})
.catch((err) => {
console.log(err);
});
});
}
我对使用 node.js 进行异步还很陌生,所以如果可能的话,请你提供一个清晰的例子。
【问题讨论】:
-
map 是否返回承诺? Promise.all 期待承诺。
-
嗨,迈克,我已经尝试将它包装在 Promise.resolve() 中,但我得到了相同的结果。
-
首先,我建议你将 .all 部分的内部放入一个函数中,以便轻松查看发生了什么,并确保它返回一个可迭代的,即数组、对象等。在目前的方式中,它是很难理解会发生什么
-
为什么不创建一个数组变量 (var myArray = []),然后将您的地图代码移出 Promise.all?然后,不要像现在这样返回每个承诺,而是将其推送到数组 (myArray.push(promise)) 中。然后将该数组传递给 Promise.all。通过这种方式,您可以验证您是否拥有 Promise.all 所期望的可迭代的 Promise。
标签: node.js asynchronous promise es6-promise