2016-09-28 123 views
0

我有一个服务设计,它需要一些参数,然后通过输入数组循环,并找出哪个项目是空的,然后将它们添加到数组,然后$ q所有解决它应该给我的空物品阵列。需要帮助解决嵌套承诺,承诺没有得到解决

输入项目

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; 
     } 

的阵列现在的问题是$ q.all是永远不会解决。尽管所有内部承诺都已得到解决。

+0

是达到了这个代码'如果(response.isEmpty){'每个承诺? –

+0

是的,但是在放置$ timout包裹之后放入 – Dreamweaver

+0

_之后放置$ timout_你是什么意思? –

回答

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

抱歉,但我有一个小的疑问: 返回deferred.resolve({数据:输入,isEmpty:isEmpty});?在哪里这个承诺诺言被定义 – Dreamweaver

+0

@Dreamweaver,是的,一个错字,只是用'return {data:input,isEmpty :isEmpty}' –

+0

好吧:) ..我只是做了同样的事情,但想与你检查.. :) – Dreamweaver