当两个http请求都完成执行功能

时间:2013-04-08 07:56:44

标签: ajax asynchronous angularjs

我目前正在学习具体的 Javascript AngularJS ,有一件事我似乎无法理解该怎么做。正如你将要看到的那样,我也在努力将自己的思维从“顺序”思维中转移开来 我想发出两个$http.post()请求,当它们都成功时,执行一个函数。我设法通过嵌套这样的请求来使它工作:

$http.post(url, {something}).success(function (response) {
    $http.post(url, {something}).success(function (secondResponse) {
      myFunction();
    });
});

这是有效的,但这是嵌套的,不是异步的,而且通常很蹩脚。我想知道是否有可能像这样提出这些请求(我知道以下代码无法正常工作):

$http.post(url, {something}).success(function (response) { someKindOfFlag = true });    
$http.post(url, {something}).success(function (response) { anotherKindOfFlag = true });
if (someKindOfFlag && anotherKindOfFlag) { myFunction(); }

2 个答案:

答案 0 :(得分:2)

在这种情况下,正确的解决方案是继承promise API并使用AngularJS $q service - 其$q.all()方法更精确。

$ http服务已经可以使用promises,因为它从$ http函数调用返回一个promise。

要在两个$http请求完成后执行回调,您可以通过以下方式使用$q.all()方法:

$q.all([$http.post(url, {something}), $http.post(url, {something})]).then(function(arrayOfResponses) {
  // success callback code goes here
});

答案 1 :(得分:1)

你应该在Javascript中听说过$ q或promises,特别是Angular。为了实现您的目标,您需要使用$ q API。

这是你如何做到的。您需要在服务或控制器中注入$ q(但是,如果可能的话,我建议将其用于服务!)。

var firstResponse = $http.post(url, {something});

var secondResponse = $http.post(url, {something});

$q.all([firstResponse,secondResponse]).then(function(data){
      //data[0] === firstResponseData
      //data[1] === secondResponseData 
      myFunction();
});