ForEach循环中的Jquery嵌套Promise

时间:2017-02-22 15:40:42

标签: jquery

从循环内部的嵌套promise中返回promise的最佳方法是什么?我不确定如何使用何时或如何摆脱承诺。

function UploadDocuments()
{

_.forEach(documentArray, function (document) {

             uploadHelper.uploadFile(document.file, "Doclib").done(function (results) {

                //success
                uploadHelper.getDocumentListItem(results.d.ListItemAllFields.__deferred.uri).done(function (listItem) {

                    var payLoad = {
                        "Title": document.title,
                        "FileLeafRef": document.title,
                    };

                    //success
                    uploadHelper.updateDocumentListItem(listItem.d.__metadata, payLoad).done(function () {
                        alert("Successfully Uploaded Document");

                    }).fail(function () {

                        alert("Upload failed");
                    });

                }).fail(function () {

                    alert("get listItem failed");
                });

            }).fail(function () {

                alert("upload failed");
            });

        });

}

我希望能够调用此函数返回一个promise,然后继续处理。之后如

UploadDocuments().then(function(){
      //continue

});

1 个答案:

答案 0 :(得分:0)

我不确定是否有一种很好的方式,或者至少我无法想到一个,在循环中做你正在做的事情。一个promise只能解析一次,所以它必须在循环完成运行之后,但是假设你的uploadHelper对象主要是异步方法,那么无法保证那些异步操作在循环结束和promise解析之前就已经通过/失败了。

似乎更好的模式可能是Promise.all(),它接受​​包含在promises中的异步操作数组,并在所有这些操作都通过时解析。您需要对辅助方法进行一些修改,但是您可以遍历文档并添加一个承诺,将所有doc处理到数组,然后在结果数组上调用Promise.all()。