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()的缺点。如果一个承诺被拒绝,那么整个事情都会被拒绝。承诺的大部分效用是,在操作访问返回数据后,您可以确定操作是否正确,但您似乎没有返回上一次调用的任何内容?是否有些东西不起作用,或者您只是在寻找一个更好的模式?只是在寻找一个更好的模式,如果一个文档上传失败,我希望继续,但我想会的,因为我在调用之外有一个循环