2014-10-02 30 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---"); 
     }); 
}