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

时间:2011-02-04 10:55:34

标签: javascript jquery xmlhttprequest synchronous

为什么不将该函数返回给responseText?

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

(如果我定义了success-callback-function并将async设置为true,则它可以工作!) 在此先感谢!!

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

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

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

(您将获得XMLHTTPRequest对象。)

5 个答案:

答案 0 :(得分:10)

我没有立即看到为什么它没有返回它,但我仍然使用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工作),该请求将因{而失败{3}}。各种方法来绕过SOP:

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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