Javascript 在数组中的承诺失败后尝试运行函数
我有一个承诺数组和一个在承诺完成后需要调用的函数。但是,每当数组中有一个promise失败时,my$q.all(promise)将不会启动回调函数Javascript 在数组中的承诺失败后尝试运行函数,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我有一个承诺数组和一个在承诺完成后需要调用的函数。但是,每当数组中有一个promise失败时,my$q.all(promise)将不会启动回调函数 function searchLibraries(library) { //console.log(library); console.log('inside searchlibraries'); var libraryCount = library.length; for (var i = 0; i <
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);
}
函数搜索库(库){
//控制台日志(库);
log('insidesearchlibraries');
var libraryCount=library.length;
对于(变量i=0;i
如果仍要调用parseSearchResult,请使用always()而不是then。
但如果使用它,则必须捕获parseSearchResult中的错误。。then()
接受多个参数。第二个参数是在承诺失败时调用的函数引用。您可以提供第二个参数,如中所示
$q.all(itemPromise).then(sucessHandler, failHandler)`
在Q promise库中,您可能还希望使用
.allsolited()
在所有承诺完成时获得通知,即使有些承诺失败。有关如何工作的详细信息如下所示。我使用Bluebird promise库,它提供了.solite()
添加一个计数器,在每个承诺完成时递增,无论它是失败还是成功。每次递增计数器时,检查其是否等于总承诺计数的长度。如果是这样,请调用parseSearchResult
另请参阅以及从中链接的那些。如果我想运行相同的函数,无论是否通过,我都可以。然后(parseResult,parseResult)?@Batman-是的,你可以这样做。根据您正在使用的promise库,可能有一种更简单的方法,但这将确保您的函数以任何一种方式调用。@Johan-同意这是一个问题。OP不清楚他们在这方面想要什么样的行为,并且没有显示parsearchresult()
的代码,因此我们无法真正说出他们想要什么。如果这是我的代码,我可能会想使用另一个promise库函数,它会告诉我所有请求何时完成,我可以只处理成功的请求。非常符合逻辑,但仍然值得一提的是,$q.all将在其一个承诺失败时立即失败,并且不会等待其余的承诺解决。刚刚编写了这个演示:angular中的@jfriend00$q只提供了q函数的一个子集。afaikallsolited()
不是它的一部分。