2016-09-28 17 views
0

私はいくつかのパラメータをとり、入力配列をループして空のアイテムを見つけ、それらを配列に加えてから$ qの後に追加するサービスを設計しました.allそれは私に空の項目の配列を与える必要があります解決しました。ネストされた約束を解決するための助けが必要です。約束が解決されません。

入力は、問題は、$ q.allが解決されることはありませんで、今のアイテム

function getElements(inputs) { 
      var elements= [], 
       promise, whenPromise, 
       promises = [], 
       mainPromise = $q.defer(); 
      if (inputs.length === 0) { 
       mainPromise.resolve(elements); 
       return mainPromise.promise; 
      } 

      angular.forEach(inputs, function (input) { 
       promise = getPromises(input); 
       whenPromise = $q.resolve(promise).then(function (response) { 
       $timeout(function() { 
         if (response.isEmpty) { 
        **//perform action with the response.data;** 
         } 
        }); 
       }, function() { 

       }); 

       promises.push(whenPromise); 
      }); 


      $q.all(promises).finally(function() { 
       mainPromise.resolve(outdatedEntities); 

      }); 

      return mainPromise.promise; 
     } 

     function getPromises(input) { 
      var deferred = $q.defer(); 

      someSerivce.getItemDetails(input.Id).then(function (value) { 
       if (value === null) { 
        $timeout(function() { 
         deferred.resolve({data: input, isEmpty: true}); 
        }); 

       } else { 
        //have item locally, but need to see if it's current 
        input.isEmpty().then(function (isEmpty) { 
         $timeout(function() { 
          deferred.resolve({data: input, isEmpty: isEmpty}); 
         }); 
        }, function (error) { 
         deferred.reject(error); 
        }); 
       } 

      }); 

      return deferred.promise; 
     } 

の配列です。すべての内部約束が解決されているにもかかわらず。

+0

達し、このコードは 'IF(response.isEmpty){'約束の各々のために? –

+0

はい、しかし、$タイムアウトを置いた後にラップします – Dreamweaver

+0

_その後$タイムアウトを入れます - どういう意味ですか? –

答えて

1

これは動作するはず:

function getElements(inputs) { 
    var elements = [], 
      promise, whenPromise, 
      promises = [], 
      mainPromise = $q.defer(); 
    if (inputs.length === 0) { 
     mainPromise.resolve(elements); 
     return mainPromise.promise; 
    } 

    angular.forEach(inputs, function (input) { 
     promise = getPromises(input); 
     whenPromise = promise.then(function (response) { 

      if (response.isEmpty) { 
       * *//perform action with the response.data;** 
      } 

     }, function() { 

     }); 

     promises.push(whenPromise); 
    }); 


    return $q.all(promises).finally(function() { 
     return outdatedEntities; 
    }); 
} 

function getPromises(input) { 
    return someSerivce.getItemDetails(input.Id).then(function (value) { 
     if (value === null) { 
      return {data: input, isEmpty: true}; 
     } else { 
      //have item locally, but need to see if it's current 
      return input.isEmpty().then(function (isEmpty) { 
       return {data: input, isEmpty: isEmpty}; 
      }, function (error) { 
       return error; 
      }); 
     } 
    }); 
} 
+0

申し訳ありませんが return deferred.resolve({data:input、isEmpty:isEmpty});これは約束が定義されていません – Dreamweaver

+0

@Dreamweaver、はい、タイプミスです。単に 'return {data:input、isEmpty :isEmpty} ' –

+0

Ok :)私はちょうど同じことをしましたが、Uとチェックしたいと思っていました:) – Dreamweaver

関連する問題