尝试在数组中的promise失败后运行函数

时间:2014-10-11 22:47:47

标签: javascript angularjs promise angular-promise

我有一系列的承诺和一个我需要在承诺完成后调用的函数。但是,每当单个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);
  }

2 个答案:

答案 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中捕获错误。