从循环内部的嵌套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
});
答案 0 :(得分:0)
我不确定是否有一种很好的方式,或者至少我无法想到一个,在循环中做你正在做的事情。一个promise只能解析一次,所以它必须在循环完成运行之后,但是假设你的uploadHelper对象主要是异步方法,那么无法保证那些异步操作在循环结束和promise解析之前就已经通过/失败了。
似乎更好的模式可能是Promise.all(),它接受包含在promises中的异步操作数组,并在所有这些操作都通过时解析。您需要对辅助方法进行一些修改,但是您可以遍历文档并添加一个承诺,将所有doc处理到数组,然后在结果数组上调用Promise.all()。