2

嘿伙计们,我将一些数据发布到服务器,然后基于几个变量再次发布到循环内的不同 url。

到目前为止,我正在使用作为示例:

    $scope.items = [{'name':'Test1','hasd':1,'hase':1},{'name':'Test2','hasd':0,'hase':1}];
    var promises = [];

    angular.forEach($scope.items,function(obj) {
    promises.push($http({
        type:'post',
        url:'test',
        data:obj
      }).then(function(response) { 
          if(response.status==201) {
             //do another http call
             if(obj.hasd==1) {
                $http({}).then(function() { 
                    var something=1; 
                });
             }
          }
        }));

   $q.all(promises).then(function(){
      alert('done');
   });

我遇到的问题是它只查看初始 $http 调用的承诺,而不是任何内部调用。有没有办法将所有 $http 调用添加到循环内的承诺中?

干杯,本

4

1 回答 1

10

尝试改变这个:

$http({}).then(function() { 
  var something=1; 
});

到:

return $http({}).then(function() { 
  var something=1; 
});

这意味着promises在“内部”承诺完成之前,您添加到数组中的“外部”承诺不会得到解决。

这样做的原因是then处理程序可以返回一个值或另一个承诺。要理解这一点,您需要了解所有then处理程序都会创建一个新的 Promise。所以最后总会有一个悬而未决的承诺,没人在乎。

如果您的then处理程序没有返回任何内容,那么 Javascript 将(某种程度上)undefined为您返回。因此,您的处理程序创建的承诺then将立即使用您返回的值解决,或者undefined如果您没有返回任何内容。但是你也可以返回一个新的 Promise,它会被传回你的promises数组。

于 2014-03-17T06:25:40.077 回答