当前位置: 首页 > 面试题库 >

我如何利用异步XMLHttpRequest的回调函数?

袁高明
2023-03-14
问题内容

我目前正在编写JavaScript,并对 callback 感到困惑。我发现它不是内置函数……
我现在正在阅读O’Relly JavaScript 5th Edition,它显示了示例代码,如下所示:

getText = function(url, callback) // How can I use this callback?
{
    var request = new XMLHttpRequest();
    request.onreadystatechange = function()
    {
        if (request.readyState == 4 && request.status == 200)
        {
            callback(request.responseText); // Another callback here
        }
    }
    request.open('GET', url);
    request.send();
}

基本上,我想我不了解callback…… 的总体思路。有人可以编写示例代码来利用callback上面的优势吗?


问题答案:

回调非常简单又漂亮!由于AJAX调用的性质,您 不会
阻塞脚本的执行,直到您的请求结束(然后它将是同步的)。回调只是一种指定用于一旦响应返回到您的方法即可处理响应的方法。

由于javascript方法是一流的对象,因此您可以像变量一样传递它们。

所以在你的例子中

getText = function(url, callback) // How can I use this callback?
{
    var request = new XMLHttpRequest();
    request.onreadystatechange = function()
    {
        if (request.readyState == 4 && request.status == 200)
        {
            callback(request.responseText); // Another callback here
        }
    }; 
    request.open('GET', url);
    request.send();
}

function mycallback(data) {
   alert(data);
}

getText('somephpfile.php', mycallback); //passing mycallback as a method

如果执行上述操作,则意味着您mycallback作为处理响应(回调)的方法传递。

编辑

尽管此处的示例并未说明回调的适当好处(毕竟您可以简单地将警报放在onReadyStateChange函数中!),但是重用性无疑是一个因素。

您必须记住,这里重要的是JS方法是一流的对象。这意味着您可以像传递对象一样传递它们并将它们附加到各种事件上。事件触发时,将调用附加到这些事件的方法。

当您执行操作时,request.onreadystatechange = function(){}您只是在触发适当的事件时分配要调用的方法。

因此,这里很酷的事情是这些方法可以重用。假设您有一个错误处理方法,当AJAX请求中为404时,该方法会弹出警报并填充HTML页面中的某些字段。

如果您无法分配回调或将方法作为参数传递,则必须一遍又一遍地编写错误处理代码,而要做的只是将其分配为回调,所有错误处理将被排序一气呵成。



 类似资料:
  • 我的JavaScript代码如下所示: 完成所有这些异步调用后,我想计算所有数组的最小值。 我怎么能等到他们所有人呢? 我现在唯一的想法是有一个布尔数组叫做done,并在第i个回调函数中将done[i]设置为true,然后说while(not all are done){} edit:我想一个可能的,但很难看的解决方案是在每个回调中编辑done数组,然后在每个回调中设置了所有其他done的情况下调

  • 问题内容: 我的代码在javascript中看起来像这样: 在完成所有这些异步调用之后,我想计算所有数组的最小值。 我要如何等待所有人? 我现在唯一的想法是拥有一个名为done的布尔数组,并在第i个回调函数中将done [i]设置为true,然后说while(不是全部都完成了){} 编辑:我想一个可能但很丑陋的解决方案是在每个回调中编辑完了的数组,然后如果每个回调中都设置了所有其他完成,则调用一个

  • 问题内容: 在SO中多次问过这个问题。但是我还是收不到东西。 我想从回调中获得一些价值。请看下面的脚本进行澄清。 如果我尝试返回该值,则只是“未定义”。我遵循了SO的一些想法,但仍然失败。 那些是: 问题答案: 这是不可能的,因为您无法从同步方法内部的异步调用返回。 在这种情况下,您需要将回调传递给foo,该回调将接收返回值 问题是,如果内部函数调用是异步的,则所有“包装”此调用的函数也必须是异步

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调