繁体   English   中英

无法通过回调和异步理解此javascript代码

[英]Can't understand this javascript code with callback and async

原始线程http://recurial.com/programming/understanding-callback-functions-in-javascript/

示例js代码,

function some_function2(url, callback) {
    var httpRequest; // create our XMLHttpRequest object
    if (window.XMLHttpRequest) {
        httpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        // Internet Explorer is stupid
        httpRequest = new
            ActiveXObject("Microsoft.XMLHTTP");
    }

    httpRequest.onreadystatechange = function() {
        // inline function to check the status
        // of our request
        // this is called on every state change
        if (httpRequest.readyState === 4 &&
                httpRequest.status === 200) {
            callback.call(httpRequest.responseXML);
            // call the callback function
        }
    };
    httpRequest.open('GET', url);
    httpRequest.send();
}
// call the function
some_function2("text.xml", function() {
    console.log(this);
});
console.log("this will run before the above callback");

该主题中的解释,

在此示例中,我们创建httpRequest对象并加载XML文件。 在函数底部返回值的典型范例在这里不再起作用。 我们的请求是异步处理的,这意味着我们开始请求并告诉它在完成时调用我们的函数。

我们在这里使用两个匿名函数。 重要的是要记住,我们可以很容易地使用命名函数,但是为了简洁起见,它们只是内联编写的。 每当我们的httpRequest对象状态发生变化时,就会运行第一个匿​​名函数。 我们忽略它,直到状态为4(表示已完成)并且状态为200(表示已成功)。 在现实世界中,您想检查请求是否失败,但是我们假设文件存在并且可以由浏览器加载。 这个匿名函数被分配给httpRequest.onreadystatechange,因此它不会立即运行,而是在我们的请求发生状态变化时立即调用。

当我们最终完成AJAX请求时,我们不仅运行了回调函数,而且还使用了call()函数。 这是调用回调函数的另一种方式。 我们之前运行该函数所使用的方法在这里可以正常工作,但我认为值得证明对call()函数的使用。 或者,您可以使用apply()函数(两者之间的区别超出了本教程的范围,但是涉及如何将参数传递给该函数)。

使用call()的好处是,我们设置了执行函数的上下文。 这意味着,当我们在回调函数中使用this关键字时,它引用的是我们作为call()的第一个参数传递的内容。 在这种情况下,当我们在匿名回调函数中引用此引用时,就是引用AJAX请求中的responseXML。

最后,第二个console.log语句将在第一个console.log语句之前运行,因为直到请求结束才执行回调,直到那一刻发生,其余代码才继续向前并继续运行。

最后,这些是我的问题。

每当我们的httpRequest对象状态发生变化时,就会运行第一个匿​​名函数。

好吧,我检查了调试模式,这个匿名函数每次都在调用,直到readyState ==4。但是who每次who在调用这个函数呢???

2)无法理解call(), callback.call() , callback.apply()之间的区别用法

我的问题是,如果我将代码更改为

  callback(httpRequest.responseXML);

// call the function
some_function2("text.xml", function(response) {
    console.log(response);
});

这与原始代码不同吗?

异步和回调确实很困难:(

但是谁在每次调用此函数呢?

XMLHttpRequest对象。

与以下原则相同:

button.addEventListener('click', foo);

每次单击按钮时都会调用函数foo。

无法了解call()callback.call()callback.apply()之间的区别用法

后两者允许您在上下文(的值传递this函数内部)作为参数。

如果我更改代码,例如…与原始代码不一样

是。

这里使用.call()问题是它不应该那样工作。

的第一个参数.call().apply()被认为是不可选的,并且定义了的值this被调用的函数的内部。

之间的差.call().apply().call()预计参数来分离的功能作为逗号,而.apply()预计参数是一个数组内。

但是谁每次都调用此函数呢???

首先,您将需要了解异步事件循环的工作原理:每当发生某事时执行JavaScript,然后等待下一件事发生。 因此,在这种情况下,HTTP管理器代码会通知JavaScript解释器它具有新的readyState,并触发readyStateChange事件。 当JS事件队列调度程序找到时间后,它将调用事件侦听器。

call(),callback.call(),callback.apply()之间的差异用法

首先,您需要了解this关键字的工作方式。 仅使用callback() ,未设置函数的上下文。 您可以使用函数的call方法来指定它,就像您阅读的文章所说的那样。 还要检查电话与申请之间有什么区别?

暂无
暂无

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

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