2015-11-01 103 views
1

下面的函數試圖返回一個承諾,這將只有當所有的異步HTTP調用完成解決創建:

$scope.saveThat = function() { 
    var promises = []; 

    for (var i = 0; i < array.length; i++) { 
     var newPromise = $q.defer(); 
     promises.push(newPromise); 

     // some more code... 

     (function (i, newPromise) { 
      $http(httpData) 
       .success(function (response) { 
        newPromise.resolve('Success'); 
       }) 
       .error(function (response) { 
        newPromise.reject('Error'); 
       }); 
     })(i, newPromise); 

    } 
    return $q.all(promises); 
}; 

而下面的代碼片段調用這個功能。

// save this... 
var promise1 = $rootScope.saveThis(result.Person); 
promise1.then(function (success) { 
    }, function (error) { 
     saveErrorMessage += 'Error saving this: ' + error + '.'; 
    }); 

// save that... 
var promise2 = $rootScope.saveThat(result.Person); 
promise3.then(function (success) { 
    }, function (error) { 
     saveErrorMessage += 'Error saving that: ' + error + '.'; 
    }); 

// wait until all promises resolve 
$q.all([promise1, promise2]) 
.then(
    function (success) { 
     $scope.$emit(alertEvent.alert, { messages: 'Saved successfully!', alertType: alertEvent.type.success, close: true }); 
    }, function (error) { 
     $scope.$emit(alertEvent.alert, { messages: saveErrorMessage, alertType: alertEvent.type.danger }); 
    }); 

我的問題是,第二個承諾($q.all([promise1, promise2]))即使解決了當promise2的承諾還沒有得到解決。

+0

停止(http://stackoverflow.com/q/23803743/1048572)和你的問題就會迎刃而解。 – Bergi

+0

@Bergi,非常感謝!是的,我肯定是新的承諾 –

回答

1

因爲您沒有創建promise的數組,實際上它包含一個$ q.defer()對象。您應該使用的

promises.push(newPromise.promise); 

代替

promises.push(newPromise); 

你也需要避免那些反模式,因爲你正在創建$q對象不必要的,你有希望的對象有從$http.get返回。使用[遞延反模式]

代碼

$scope.saveThat = function() { 
    var promises = []; 
    for (var i = 0; i < array.length; i++) { 
     // some more code... 
     var promise = $http(httpData) 
     .then(function(response) { 
      return 'Success'; //returning data from success resolves that promise with data 
     }, function(response) { 
      return 'Error'; //returning data from error reject that promise with data 
     }); 
     promises.push(promise); //creating promise array 
    } 
    return $q.all(promises); //apply $q.all on promise array 
}; 
+0

你在哪裏使用'proimise'變量?你在哪裏初始化'newPromise'? –

+1

@miparnisari那是我的錯誤..複製粘貼錯誤。在我的編輯 –

+1

啊我認爲這樣:)謝謝你的幫助,我會嘗試你所說的並讓你知道。 –