如何使用AngularJS处理$ http同步请求

时间:2015-07-15 17:33:26

标签: javascript angularjs

我需要同步调用3 $ http请求。我的意思是在收到第一次请求的回复后,将调用第二个请求。在收到第二个回复后,将调用下一个第3个。

示例:

 $http.get('FIRSTURL', param1).success(function(response){
     $http.get('SECONDURL', param2).success(function(response){
         $http.get('THIRDURL', param3).success(function(response){
            //Need to do some stuff with response
         });
     })
 });

任何人都可以建议使用AngularJ

更好地实现它

5 个答案:

答案 0 :(得分:0)

这是按顺序执行此操作的唯一方法。如果你想让它更漂亮,你可以将每个项目放入一个函数,然后链接then调用:

function doSomething() {
    return $http.get('FIRSTURL', param1);
}

function doSomething1() {
    return $http.get('SECONDURL', param2);
}

function doSomething2() {
    return $http.get('THIRDURL', param3);
}

然后:

doSomething().then(doSomething1).then(doSomething2);

答案 1 :(得分:0)

如果你想强制同步,那么你可以利用"然后"从$ http调用返回的promise的方法, 请注意,这只会同步您的调用顺序,它不会导致调用阻止您的其余代码。

$http.get('https://foo1')
.then(function(response) {
  return $http.get('https://foo2');
})
.then(function(response) {
  return $http.get('https://foo3');
})
.then(function(response) {
  return $http.get('https://foo4');
})
.catch(function(response) {
  console.error('error', response.status, response.data);
})
.finally(function() {
  console.log("finally");
});

答案 2 :(得分:0)

像常规承诺一样排队:

$http.get('http://fiddle.jshell.net', param1)
    .success(function(response){
        return $http.get('http://fiddle.jshell.net', param2)
    })
    .success(function(response){
        return $http.get('http://fiddle.jshell.net', param3);
    })
    .success(function(response){
        console.log('done!');
        //Need to do some stuff with response
    });

以下是工作示例:http://jsfiddle.net/301gt2sm/

答案 3 :(得分:0)

您可以使用promise功能将它们链接起来,而不是嵌套回调:

$http.get('FIRSTURL', param1)
    .then(getSecond)
    .then(getThird)
    .then(function(response){
        //Need to do some stuff with response
    });

function getSecond(response){     返回$ http.get(' SECONDURL',param2); }

function getThird(response){     返回$ http.get(' THIRDURL',param3); }

答案 4 :(得分:0)

虽然不确定如何在特定的AngularJS代码中处理它,但仍然有一个使用Javascript bind()的工作。请试试这个。

myService.doSomething().then(myService.doSomething1.bind(myService)).then(myService.doSomething‌​2.bind(myService));