Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在数组中的承诺失败后尝试运行函数_Javascript_Angularjs_Promise_Angular Promise - Fatal编程技术网

Javascript 在数组中的承诺失败后尝试运行函数

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 <

我有一个承诺数组和一个在承诺完成后需要调用的函数。但是,每当数组中有一个promise失败时,my$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);
  }
函数搜索库(库){
//控制台日志(库);
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函数的一个子集。afaik
allsolited()
不是它的一部分。