我有一系列的承诺和一个我需要在承诺完成后调用的函数。但是,每当单个promise失败时,我的$ q.all(promise)将不会启动回调函数。
function searchLibraries(library) {
//console.log(library);
console.log('inside searchlibraries');
var libraryCount = library.length;
for (var i = 0; i < libraryCount; i++) {
//console.log(i,library[i].siteUrl,library[i].listID,library[i].listName)
itemPromise[i] = $().SPServices({
operation: "GetListItems",
webURL: library[i].siteUrl,
listName: library[i].listID,
CAMLViewFields: cViewFieldsLimited,
CAMLQuery: cQueryAllCheckedOutDocuments,
CAMLQueryOptions: cQueryOptions,
cacheXML:true,
completefunc: function (xData,Status){
if($(xData).hasSPError()){
console.log("Error");
console.log("Error Code:" ,$(xData).getSPErrorCode());
console.log("Error Message:" ,$(xData).getSPErrorText());
}
}
})
}
return $q.all(itemPromise).then(parseSearchResult);
}
答案 0 :(得分:5)
.then()
需要多个参数。第二个参数是一个函数引用,如果promise失败则调用它。您可以在
$q.all(itemPromise).then(sucessHandler, failHandler)`
在Q promise库中,您可能还希望使用.allSettled()
在所有承诺完成后收到通知,即使有些失败也是如此。有关其工作原理的详细信息为here。我使用提供.settle()
的Bluebird promise库。
答案 1 :(得分:2)
如果你想要调用parseSearchResult - 使用always(http://api.jquery.com/deferred.always/)而不是那时。 但是如果你使用它,你必须在parseSearchResult中捕获错误。