5

为什么不将该函数返回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 对象。)

4

5 回答 5

11

我没有立即明白为什么它没有返回它,但我仍然会使用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 为您提供不同的responseTexton error 值(至少在 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 工作),该请求将因为Same Origin Policy而失败。绕过 SOP 的各种方法:

于 2011-02-04T10:58:34.823 回答
1

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

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

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

于 2011-02-04T10:58:00.190 回答
0

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

你必须把你的代码分成至少两部分。第一部分是在 ajax 调用之前,第二部分是在成功之后,并将您想要对请求的数据执行的所有操作都放在成功回调中。异步请求以这种方式工作。

于 2011-02-04T10:59:29.507 回答
0

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

于 2011-02-04T11:01:05.337 回答
0

按照设计,异步请求不能突然提供 responseText ;-) 您必须设置回调函数并决定如何处理 responseText。

于 2011-02-04T11:02:22.150 回答