2016-06-09 33 views
1

我有一個保存函數,我需要調用另一個函數來獲取修訂版本號。並在那裏進行API調用。因爲兩者本質上都是異步的。如何使一個功能,使等到其他執行Angular:如何使一個異步函數先後執行

$scope.getRevision = function(callback){ 
    Api.Product.querymyProdById({ prodId: $scope.editProdId }).$promise.then(function(result) { 
     if (result && result.length>=1 && result[0].effectiveDate != $scope.editProdmyDate) { 
      $scope.editProdRevision = result && result[0].revision +1; 
      callback(); 
     } else { 
      $scope.editProdRevision = 100; 
     } 
    }); 
} 

$scope.saveProd = function(){ 
    $scope.getRevision(function(){}); 

    Api.Product.save({ 
     id: $scope.ProdId; 
     revision:$scope.editProdRevision 
     -some code 

} 

上面的代碼我想確保保存API不應該叫,直到我得到的prodRevision。

有什麼建議嗎?

+1

回報承諾,並把它們連。如果你在一個答覆中返回一個承諾,那麼在繼續之前它會等待它解決。 – ste2425

回答

5

既然你承諾不要惹回調。讓你的功能實際上返回一個承諾,並使用then來鏈接呼叫。

$scope.getRevision = function(){ 
    return Api.Product.querymyProdById(..).$promise...; 
} 

$scope.saveProd = function() { 
    return $scope.getRevision().then(function() { 
     return Api.Product.save(...); 
    }) 
} 
+0

同意,Api.Product.querymyProdById應該返回一個承諾,如果您使用的是$ http,那麼您可以直接返回該承諾或使用$ q創建自定義承諾。 – Markus

1

這正是JavaScript的神發明了回調

$scope.saveProd = function(){ 
    $scope.getRevision(function(){ 
     // this happens after getRevision finished 
     Api.Product.save({ 
      id: $scope.ProdId; 
      revision:$scope.editProdRevision 
      -saome code 
     }); 
    }); 

} 
0

你可以簡單的化妝一個異步調用前一後,像這樣的 -

// First Simple GET request example: 
$http({ 
    method: 'GET', 
    url: '/someUrl' 
}) 
.then(function successCallback(response) { 
    // this callback will be called asynchronously 
    // when the response is available 
    // Second Simple GET request example: 
    $http({ 
    method: 'GET', 
    url: '/someUrl' 
    }) 
    .then(function successCallback(response) { 

    }, function errorCallback(response) { 

    }); 
}, function errorCallback(response) { 
    // called asynchronously if an error occurs 
    // or server returns response with an error status. 
}); 
+2

如果你返回第二個'$ http',它會平滑鏈條。意味着您可以在更高級別註冊第二個'.then',這將等待兩個AJAX請求完成。不應該將承諾視爲嵌套回調。 – ste2425

+0

@ ste2425你可以請一個例子請解釋一下,或者我可以讀一些資源的鏈接?謝謝! – atefth

+1

繼承人[pastebin](http://pastebin.com/9PMf9TZn)你的例子。和[博客文章](http://solutionoptimist.com/2013/12/27/javascript-promise-chains-2/)可能有所幫助。承諾是出色的東西,但是與回調相比,它是一個完整的工作方式。你可以得到真正簡潔的數據流。你可以像你一樣嵌套它們(對於複雜鏈條很有用),但是這個用例並沒有要求它。展平鏈條將具有完全相同的效果並且更具可讀性。 – ste2425

相關問題