2013-07-16 41 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({...}); 
    });