繁体   English   中英

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

[英]Can I return data from an anonymous callback function in jQuery?

我敢肯定这很简单,但是我将探讨Javascript中的范围问题。 我正在执行以下操作:

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

这部分工作正常-我在控制台中看到了想要的字符串。 但是我真正想要的是获取该数据变量并将其放入字符串中。 这样的事情(无效):

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

这为string提供了[object XMLHttpRequest]的值。

我想念什么?

哎呀

是的,我错过了一个事实,正如其名称所说,Ajax是异步的。 谢谢大家给我拍我需要的额头。

后记

我之所以不简单地使用回调函数内部的结果,是因为我实际上需要每隔几秒钟执行多个AJAX请求,收集数据并将它们全部添加到页面之后。

现在,我有了一个小的闭包功能-请求在一个循环中完成,并将数据传递到闭包。 当计时器关闭时,我不带参数的情况下调用了关闭函数,它告诉它“将您的前一批数据追加到页面上(请求现在肯定已经完成了),清除了缓存,并准备开始从中接收新数据我的循环中的AJAX回调。”

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

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

从回调函数返回数据仅将其返回给该回调函数的调用者,即jQuery,它对此不执行任何操作。

您不能做的就是将该值从回调函数传递到周围函数的赋值中,而您之所以不能这样做,是因为这将花费时间。 get()方法立即返回,在后台启动一个HTTP请求,该请求稍后将完成。 这样做时,将调用回调函数,但到那时该string已很久就被分配了。

您不能同步调用异步代码,反之亦然。 如果要对HTTP请求的结果进行处理,则只能在回调函数中进行处理。 如果要提供一个发出HTTP请求并将结果传回的函数,则必须自己接受并调用一个回调函数来做到这一点:

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

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

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

  1. 创建一个XmlHttpRequest对象
  2. 建立请求并发送
  3. 等待回应
  4. 收到响应(那里有不同的状态)
  5. 处理回应
  6. 通知回调

回调中的参数data到达步骤6,而$.get()调用返回到步骤2。因此您的数据不可用。 您需要在第6步中的某个变量中设置数据,然后从那里进行处理。


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

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

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

您可以执行以下两项操作之一:

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

2-将使用变量的所有内容放入成功回调中。

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

这是您要尝试的:

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
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM