【问题标题】:Trying to run a function after a promise fail in array在数组中的承诺失败后尝试运行函数
【发布时间】:2014-10-12 23:02:33
【问题描述】:

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

【问题讨论】:

  • 添加一个计数器,当每个 promise 完成时递增,无论它是失败还是成功。每次增加计数器时,检查它是否等于总承诺计数的长度。如果有,请致电parseSearchResult
  • 另见$q.all - take only those that resolved 以及从那里链接的那些

标签: javascript angularjs promise angular-promise


【解决方案1】:

.then() 接受多个参数。第二个参数是在 promise 失败时调用的函数引用。您可以提供第二个参数,如

$q.all(itemPromise).then(sucessHandler, failHandler)`

在 Q Promise 库中,您可能还想使用 .allSettled() 在所有 Promise 完成时收到通知,即使有些失败。有关其工作原理的详细信息是here。我使用提供 .settle() 的 Bluebird Promise 库。

【讨论】:

  • 所以如果我想运行相同的函数,无论通过还是失败,我都可以这样做 .then(parseResult,parseResult) ?
  • @Batman - 是的,你可以这样做。根据您使用的 Promise 库,可能有更简单的方法,但这将确保您的函数以任何一种方式调用。
  • @Johan - 同意这是一个问题。 OP 不清楚他们在这方面想要什么行为,也没有为parseSearchResult() 显示代码,所以我们无法真正说出他们想要什么。如果是我的代码,我可能想使用一个不同的 promise 库函数,它会告诉我所有请求何时完成,我可以只处理成功的请求。
  • 合乎逻辑但仍然值得一提的是 $q.all 将在它的 一个 承诺失败并且不等待其余承诺解决时立即失败。刚刚写了这个演示来玩:jsfiddle.net/kw5vp0yz
  • @jfriend00 $q in angular 仅提供 Q 的一部分功能。afaik allSettled() 不是其中的一部分。
【解决方案2】:

如果您仍然想调用 parseSearchResult — 使用 always (http://api.jquery.com/deferred.always/) 而不是 then。 但是如果你使用它,你必须在 parseSearchResult 中捕获错误。

【讨论】:

    猜你喜欢
    • 2019-01-26
    • 2018-11-24
    • 1970-01-01
    • 2017-07-25
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多