我试图在Promise中编写一个包含for
循环的函数,但是循环只在迭代时执行,并且承诺永远不会被解析。
我的代码如下所示:
function appendPosts() {
return functionThatReturnsAPromise()
.then( result => {
return new Promise( (resolve, reject) => {
var list = [];
result.forEach( item => {
//do stuff to item
list.push(item);
});
resolve(list);
});
})
.then( list => {
return new Promise( (resolve, reject) => {
//This loop only runs once, even when list has contains many items
for ( var i = 0; i < list.length; i++ ) {
document.querySelector("someSelector").appendChild( list[i] );
}
resolve();
});
});
}
显然,我做错了什么。有什么想法吗?
感谢您的时间。 - 丹尼尔
答案 0 :(得分:0)
@MaazSyedAdeeb是对的。循环中抛出一个异常,我没有一个catch块。感谢。
答案 1 :(得分:0)
选择器可能没有返回匹配项,因此在appendChild
上调用undefined
,触发转换为被拒绝的承诺的异常。
如果您在通话中添加了.catch
:
appendPosts().then(function () {
console.log('all done');
}).catch(function (err) {
console.log('error occurred: ', err);
});
但是还应该提到你正在使用promise constructor anti-pattern。也就是说,在then
回调中,您只需返回一个值,该值将成为then
将返回的承诺的承诺值。所以没有必要new Promise()
。相反,这样做:
function appendPosts() {
return functionThatReturnsAPromise().then( result => {
// Just return the mapped array:
return result.map( item => {
//do stuff to item
return item;
}).then( list => {
for ( var i = 0; i < list.length; i++ ) {
// Make sure the selector will result in a match:
document.querySelector("someSelector").appendChild( list[i] );
}
});
});
}