如何使用jQuery执行同步请求?

为什么不返回该函数的responseText?

function LoadBookmarksAsXml() { return $.ajax( { type: 'GET', async: false, url: 'http://www.google.com/bookmarks/?output=xml&num=10000' }).responseText; } 

(如果我定义了一个成功的回调函数并将async设置为true,它会起作用!)在此先感谢!!

编辑 :不要担心跨域调用; user603003表示(在对已删除的答案的评论中),这是在允许跨域请求的Chrome扩展程序中。

解决方案,如果有人想要这样做:

 return $.ajax( { type: 'GET', async: false, url: 'http://www.google.com/bookmarks/?output=xml&num=10000', }); 

(您将获得XMLHTTPRequest对象。)

我没有立即明白为什么它不会返回它,但我仍然使用success回调:

 function LoadBookmarksAsXml() { var result; $.ajax( { type: 'GET', async: false, url: 'http://www.google.com/bookmarks/?output=xml&num=10000', success: function(data) { result = data; } }); return result; } 

即使$.ajax返回XMLHttpRequest对象(在1.4或更早版本中)或jqXHR对象(在1.5+中),我仍然更喜欢使用success函数和error函数来清楚。 此外,不同版本的jQuery在出错时为responseText提供不同的值(至少在Chrome上; 1.4.4返回空字符串,1.5.0返回undefined )。


如果有任何方法可以避免它 ,请避免它。 同步请求完全锁定了大多数浏览器的UI(不仅仅是页面的UI,浏览器管理的每个选项卡中的每个页面)。 由于ajax请求可能需要一两秒钟(或五个或十个),因此会产生非常不愉快的用户体验。 几乎所有时间,您都可以通过重构函数来避免它,因此它接受用于提供结果的回调:

 function LoadBookmarksAsXml(callback) { $.ajax( { type: 'GET', url: 'http://www.google.com/bookmarks/?output=xml&num=10000', success: function(data) { callback(data); }, error: function() { callback(null); } }); } 

偏离主题 :如果请求完全有效,我会感到惊讶,因为从表面上来看(除非您为Google工作),该请求将因同源策略而失败。 各种方法来绕过SOP:

  • JSONP
  • CORS (但它需要浏览器支持,并且www.google.com允许来自您的来源的请求)
  • 使用YQL作为代理

$.ajax永远不会返回响应文本,它总是返回为进行Ajax调用而创建的XMLHTTPRequest对象。

您仍然需要定义一个成功回调,例如,设置一个可以返回的局部变量。

标准免责声明:同步请求通常是不鼓励的做法,因为它们可以冻结当前页面。

等待函数的响应不是异步的,ajax调用在完成后会有响应,你必须通过定义成功事件的回调来处理响应。

您可以将代码分解为至少两部分。 第一部分是在ajax调用之前,第二部分是在成功之后,并且在成功回调中将您想要做的所有事情与所请求的数据放在一起。 异步请求以这种方式工作。

这样做是一个非常糟糕的主意。 Javascript将在HTTP请求的持续时间内阻塞,也就是说,在ajax调用返回之前,UI线程中的任何其他内容都不会运行。 使用回调。

按照设计,异步请求无法提供响应文本;-)您必须设置回调函数并决定如何处理responseText。