2014-10-02 33 views
0

我正在使用$ http进行http调用。我有一个成功的方法,它被称为从服务器获得成功的响应。 我的问题是如何等待(即不要完成通话之前所写的内容)以便http呼叫克服?如何等待http呼叫在js中完成?

main(){ 
    var val = myFunction(); 
    console.log("---after receiving response---"); 
    return val; 
} 
myFunction(){ 
    var temp; 
    fnResource.get(function(data){ 
     { 
      console.log("---on success---"); 
      temp = data; 
     });  
    return temp; 
} 

在这种情况下,我的代码打印“---接收响应---经过”先“---成功---”,但我打算“---成功---“首先总是打印。

更新:更新了片段以进一步解释我的场景。

+1

的'success'回调其实就是告诉你通话结束......将您的代码里面... – LcSalazar 2014-10-02 20:00:04

+0

为什么你不这样做,你什么甲肝e在“成功”回调本身内部做? – Beterraba 2014-10-02 20:00:13

回答

1

只需将$http.get(...)之后的代码放在一个单独的函数中,并从success回调中调用它。

0

你的混乱可从以下事实所产生的是AJAX调用是非阻塞(如在异步,如在同步Ĵ avascript ND X ML)。您可以在一行中触发多个AJAX请求,并且不会阻止其他人被发送,直到他们被检索到。试想一下:

$http.get('/route1').success(function() { console.log('route 1 success'); }); 
$http.get('/route2').success(function() { console.log('route 2 success'); }); 
$http.get('/route3').success(function() { console.log('route 3 success'); }); 

AJAX调用出来/route2/route3不必等待第一个AJAX调用来完成他们在发送前。此外,在这种情况下,您无法保证出于多种不同原因返回的顺序,这些问题完全超出了范围。问题的关键是,运行在上面的代码中多次可能会导致在日志中这样看:

route 1 success 
route 2 success 
route 3 success 

但同样有可能,它可能看起来像这样:

route 2 success 
route 1 success 
route 3 success 

而且你有没有控制它。你可以,但是,做这样的事情来的HTTP请求,按照一定的顺序返回:

$http.get('/route1').success(function() { 
    $http.get('/route2').success(function() { 
     $http.get('/route3').success(function() { 
      console.log('all requests complete'); 
     }); 
    }); 
}); 

以上Ajax请求route1将阻止请求route2,直到它返回

0

尝试使用always

myFunction(){ 
    $http.get("..api/endpoint/"). 
     success(function(data){ 
      console.log("---on success---"); 
     }) 
     .always(function() { 
      console.log("---after receiving response---"); 
     }); 
}