2013-07-16 62 views
1

我有兩個Web服務調用,需要從我的JQuery 1.9.1應用程序中調用。在第二次電話會議之前,我需要第一個結果。如何在getJSON上阻塞線程

看來我的getJSON請求不會阻塞該線程。我被告知JavaScript不是多線程的,那麼如何阻止這些服務器調用?

+12

不要。將第二個電話放在第一個電話的回叫功能中。 – Barmar

+0

請注意,如果阻止JavaScript線程(除非使用工作者,例如),瀏覽器也會阻止! – Sirko

+0

或者,甚至更好(如果可能的話)創建一個服務器代理,將這些調用結合起來,然後調用此代理。然後你做了一次而不是兩次。 –

回答

2

好了,你不需要阻塞線程,這是老同學。

你有兩個選擇:

  • 讓Ajax調用syncronous。
  • 級聯ajax調用,所以第二次只在第一次調用完成後才進行。

我推薦第二種方法,因爲那是的權利的方法來做到這一點。

/* Call 1 */ 
$.ajax({ 
    url: 'first url to call', 
    data: 'first data sent to the server', 
    success: function (results1){ 

     // Do something with the results  

     /* make the second call */ 
     $.ajax({ 
      url: 'sencond url to call' 
      data: 'second data sent to the server' 
      success: function(results2){ 

       // Do something when all completed 
      }     
     }); 
    } 
}); 
1

呼叫在異步假模式您的第一個Ajax請求到服務器

$.ajax({ 
url: Url, 
dataType: 'json', 
async: false, 
data: myData, 
success: function(data) { 
    //stuff 
    } 
}); 
+1

這是一個可以添加到AJAX功能的令人驚歎的選項...... AJAX中的第一個「A」代表「異步」。 :) –

+0

即使這回答了這個問題,不要那樣做 –

+0

@roasted - 它以某種方式回答問題。它可以使用一點點擴展來展示如何將第一次調用的數據轉換爲第二次調用。無論如何。 –

3

jQuery的ajax函數都返回一個jqXHR object實現了Promise interface

而是阻止的異步請求(和其他一切)的,巢您的要求,像這樣

$.ajax({...}) 
    .done(function(data) { 
     // second request 
     $.ajax({...}); 
    });