2014-10-11 1 views
0

У меня есть набор обещаний и функция, которую мне нужно вызвать после завершения обещаний. Однако, всякий раз, когда одно обещание выходит из строя, мой $ q.all (обещание) не будет запускать функцию обратного вызова.Попытка запустить функцию после сбоя обещания в массиве

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

Добавьте счетчик, который увеличивается, когда каждое обещание будет завершено, независимо от того, произойдет ли он или не удастся. Каждый раз, когда вы увеличиваете счетчик, проверьте, равна ли его сумме общей суммы обещаний. Если это так, вызовите 'parseSearchResult' – Johan

+0

См. Также [$ q.all - принимают только те, которые были разрешены] (http://stackoverflow.com/q/25296960/1048572) и те, которые связаны оттуда – Bergi

ответ

5

.then() принимает несколько аргументов. Второй аргумент - это ссылка на функцию, которая будет вызвана, если обещание не удастся. Вы можете указать, что второй аргумент в

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

В библиотеке Q обещание, вы можете также использовать .allSettled(), чтобы получить уведомление, когда все обещания закончили, даже если некоторые терпят неудачу. Подробная информация о том, как это работает here. Я использую библиотеку обещаний Bluebird, которая предлагает .settle().

+0

, поэтому, если бы я хотел запустить ту же функцию, будь то пропуск или неудача, которую я мог бы сделать. then (parseResult, parseResult)? – Batman

+1

@ Батман - да, вы могли бы это сделать. В зависимости от библиотеки обещаний, которую вы используете, может быть еще более простой способ, но это гарантирует, что ваша функция будет вызвана в любом случае. – jfriend00

+0

+1 для ответа на вопрос OP. Тем не менее, очевидным недостатком этого и для обработки каждого обещания в отдельности было бы то, что если один или несколько элементов не работают, потенциально успешные элементы не будут анализироваться. – Johan

2

Если вы хотите позвонить parseSearchResult в любом случае - использовать всегда (http://api.jquery.com/deferred.always/) вместо того, чтобы потом. Но если вы его используете, вы должны поймать ошибки в parseSearchResult.

Смежные вопросы