Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用jQuery执行同步请求?_Javascript_Jquery_Xmlhttprequest_Synchronous - Fatal编程技术网

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

Javascript 如何使用jQuery执行同步请求?,javascript,jquery,xmlhttprequest,synchronous,Javascript,Jquery,Xmlhttprequest,Synchronous,为什么不将该函数返回responseText function LoadBookmarksAsXml() { return $.ajax( { type: 'GET', async: false, url: 'http://www.google.com/bookmarks/?output=xml&num=10000' }).responseText; } (如果我定义了一个成功回调函数并将async设置为true,它就可以工作!) 提前谢谢 编辑:

为什么不将该函数返回responseText

function LoadBookmarksAsXml()
{
  return $.ajax(
  {
    type: 'GET',
    async: false,
    url:  'http://www.google.com/bookmarks/?output=xml&num=10000'
  }).responseText;
}
(如果我定义了一个成功回调函数并将async设置为true,它就可以工作!) 提前谢谢

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

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


(您将得到一个XMLHTTPRequest对象。)

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

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


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

我不知道为什么它不返回它,但我仍然会使用
成功
回调:

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返回未定义的


如果有任何方法可以避免它,那就避免它。同步请求会完全锁定大多数浏览器的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);
    }
  });
}

离题:如果这个请求真的有效,我会感到惊讶,因为从表面上看(除非你为谷歌工作),这个请求会因为错误而失败。绕过SOP的各种方法:

  • (但它需要浏览器支持,并且www.google.com允许来自您的来源的请求)

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


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

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

根据设计,异步请求无法突然传递responseText;-)
您必须设置一个回调函数,并决定如何处理responseText。

您是指同步请求,对吗?您可以发布一下,什么有效?可能与重定向有关?@user:“(您将获得一个XMLHTTPRequest对象。)”从jQuery1.5开始,您将获得一个jqXHR对象:@jAndy:是的,我在返回添加异步示例时注意到了这一点。我复制并粘贴了原始代码,删除了
async:false
,然后说“嘿,等等,这是一个谷歌url!”@inti:Oh,你知道吗,他们(在删除的答案上)说这是一个允许x域请求的Chrome扩展。谢谢。我已将解决方案张贴在页面顶部。也许我会编辑这个函数,像你一样进行回调。(请注意,谷歌在每个a标签上都使用一个进程,但我不知道扩展如何)@t.J.Crowder是我的坏蛋,抱歉,删除了我的评论并试图收回否决票,但在5分钟内没有让我这么做。@user:如果你想回答你自己的问题(这很好),你最好的办法就是发布一个答案。几天后,如果你的答案是你认为最好的,你甚至可以接受自己的答案。更多:抱歉,我不需要success函数,我只需要返回$.ajax();正如您所解释的,它是一个XMLHTTPRequest对象。谢谢
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);
    }
  });
}