For循环在Promise内部没有完成

时间:2017-06-03 23:47:40

标签: javascript promise

我试图在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();
       });
   });
}
显然,我做错了什么。有什么想法吗?

感谢您的时间。 - 丹尼尔

2 个答案:

答案 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] );
            }
        });
    });
}