ForEach循环中的Jquery嵌套承诺

ForEach循环中的Jquery嵌套承诺,jquery,Jquery,从循环中的嵌套承诺返回承诺的最佳方式是什么?我不知道如何利用时间或如何摆脱承诺的束缚 function UploadDocuments() { _.forEach(documentArray, function (document) { uploadHelper.uploadFile(document.file, "Doclib").done(function (results) { //success

从循环中的嵌套承诺返回承诺的最佳方式是什么?我不知道如何利用时间或如何摆脱承诺的束缚

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");
            });

        });

}
我希望能够调用这个函数返回一个承诺,然后继续处理。事后如

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

}))

我不确定是否有一种很好的方法,或者至少我想不出一种,来完成你在循环中所做的事情。承诺只能解析一次,因此必须在循环完成运行后解析,但假设uploadHelper对象主要包含异步方法,则无法保证在循环结束和承诺解析时这些异步操作已通过/失败


似乎更好的模式可能是,它接受一组封装在承诺中的异步操作,并在所有操作都通过时解析。这需要对helper方法进行一些修改,但是您可以在文档中循环,并向数组中添加一个承诺,该承诺将完成所有文档处理,然后在生成的数组中调用promise.all()

是的,我有点困惑,uploadhelper返回。ajax承诺,它只是调用RESTAPI(SharePoint 2013)。我上传每个文件,然后获取每个文档列表项,然后更新每个列表项。如果链的某一部分出现故障,不确定链或处理错误的最佳方式。是的,这是Promise.all()的缺点。如果一个承诺被拒绝,那么整个事情都会被拒绝。承诺的大部分效用是,在操作访问返回数据后,您可以确定操作是否正确,但您似乎没有返回上一次调用的任何内容?是否有些东西不起作用,或者您只是在寻找一个更好的模式?只是在寻找一个更好的模式,如果一个文档上传失败,我希望继续,但我想会的,因为我在调用之外有一个循环