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

Com*_*eek 4 javascript jquery xmlhttprequest synchronous

为什么不在responseText中返回该函数?

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

(如果我定义了一个成功的回调函数并将async设置为true,它可以工作!)提前感谢!!

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

如果有人想要做同样的解决方案:

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

(您将获得XMLHTTPRequest对象.)

T.J*_*der 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;
}
Run Code Online (Sandbox Code Playgroud)

即使$.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);
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

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