我可以从jQuery中的匿名回调函数返回数据吗?

时间:2010-10-01 16:22:18

标签: javascript jquery scope

我确信这很简单,但我在Javascript的范围问题上绊倒了。我正在做以下事情:

$.get(url, function (data){console.log(data);});

这部分工作正常 - 我看到我想要的字符串出现在控制台中。但我真正想要的是获取该数据变量并将其放在一个字符串中。这样的事情(不起作用):

string = $.get(url, function (data){return data;});

这会使string的值为[object XMLHttpRequest]

我错过了什么?

糟糕

是的,我错过了正如名称所说Ajax异步的事实。谢谢你给我一个我需要的额头上的耳光,每个人。

后记

我不是简单地处理回调函数本身内部结果的原因是我实际上需要每隔几秒钟执行多个AJAX请求,收集数据,并将它们全部附加到页面上完成。

我现在已经使用了一个小闭包函数 - 请求在循环中完成,数据传递给闭包。当计时器关闭时,我调用闭包函数没有参数,这告诉它“将你的前一批数据附加到页面上(请求现在肯定已完成),清除缓存,并准备开始接收新数据循环中的AJAX回调。“

哪个(希望)表明我毕竟不是白痴。 :)

6 个答案:

答案 0 :(得分:3)

.get()发送一个AJAX GET HTTP请求并立即返回,这意味着您无法将结果分配给变量,因为结果仅在成功回调(您作为第二个参数传递的匿名函数)中可用。在此回调中,您可以调用另一个函数并将数据作为变量传递。这就是AJAX的工作原理。 A代表异步。

答案 1 :(得分:3)

从回调函数返回数据只会将其返回给该回调函数的调用者,该函数是jQuery,它对它没有任何作用。

你不能做的是将回调函数中的值传递给周围函数中的赋值,而你不能这样做的原因是因为它是时间旅行。 get()方法立即返回,从后台的HTTP请求开始,稍后将完成。当它这样做时,会调用回调函数,但到那时很久以前就已经分配了string

您无法同步调用异步代码,反之亦然。如果要对HTTP请求的结果执行某些操作,则只能在回调函数中执行此操作。如果您想提供一个发出HTTP请求并将结果传回的函数,您必须自己接受并调用回调函数:

function getThing(callback) {
    ...
    $.get(url, function(data) {
        callback(data);
    });
}

另一种方法是使用async: false同步完成整个批次。但这对每个人来说都是坏消息,因为Web浏览器会挂起,直到请求完成。

答案 2 :(得分:1)

Ajax请求是异步完成的 1 ,JQuery的ajax函数的最后一个参数是回调。要回答为什么第二个示例不起作用,您需要了解async callbacks。或者,这类似于观察者模式,其中observable是Ajax请求,observer是回调。执行请求的步骤(粗略地):

  1. 创建一个XmlHttpRequest对象
  2. 构建请求并发送
  3. 等待回复
  4. 收到回复(那里有不同的状态)
  5. 处理回复
  6. 通知回叫
  7. 回调中的参数data到达步骤6,而$.get()调用在步骤2返回。因此您的数据不可用。您需要在某个变量中设置步骤6中的数据并从那里处理它。


    1 请求可以同步完成,但Ajax中的 A 代表异步。可以使用$.get()来执行同步请求,但在技术上不能称为“Ajax”。我的观点。

答案 3 :(得分:0)

传递给匿名函数的数据var是ajax对象本身。如果要从服务器返回响应文本,可以执行以下操作:

$.get(url, 
    // data to send
    {
      'foo' : 'bar'
    },
    // receive response
    function(response){
      return response;
    } // response callback function
); // .get()

答案 4 :(得分:0)

你可以做以下两件事之一:

1 - 将您的GET更改为与{async: false }同步,您可能需要使用$ .ajax方法来执行此操作。然后在成功回调中分配变量。

2 - 在成功回调中放置使用变量的任何内容。

$.get(url, function (data){
    var string = data;
    useMyString(string);
});

答案 5 :(得分:0)

这是你正在尝试的:

var data = $.get(url, function(data){return data;});
// trying to do the stuff you want to do with data

这是你需要做的:

$.get(url, function(data){
    // do the stuff you want to do with data
});