我一直在阅读JavaScript中的异步函数,发现我并不完全理解来自here的以下代码。
这是:
doSomething(function(result) {
doSomethingElse(result, function(newResult) {
doThirdThing(newResult, function(finalResult) {
console.log('Got the final result: ' + finalResult);
}, failureCallback);
}, failureCallback);
}, failureCallback);
我不明白的是所有这些结果来自何处。
答案 0 :(得分:3)
它们是回调。回调只是一个函数,它作为参数传递给另一个函数,并用于处理接收回调的函数完成的某些操作的结果作为一个论点。你可以自己写。一个简单的例子:
function callMe(callback) {
let addition = 2 + 2;
callback(addition);
}
callMe(function(result) {
console.log(result);
});
callMe
调用其回调函数,结果为2 + 2.然后在使用callMe
时在回调函数中收到该结果,然后您可以编写自己的自定义代码来执行任何操作你想要它。
答案 1 :(得分:0)
Javascript是一种单线程语言,当异步代码块以非阻塞方式结束时,回调用作控制执行流的方法。回调通常只是另一个函数(函数B),它被传递到异步函数(函数A)以在函数A完成时运行。即
doSomething(callback) {
//fetch or ajax or whatever to server store response.
//pass response BACK to callback function
callback(response)
}
你还没有发布这些功能的内部块,但我认为我们都可以安全地假设"结果"是服务器的响应传递回回调函数I.E
error: incompatible types for redefinition of 'applyChange'
答案 2 :(得分:0)
JavaScript的美妙之处在于,您已经拥有测试它所需的一切。
您发布的代码引用了4个函数(不要忘记故障回调):
doSomething(function(result) {
doSomethingElse(result, function(newResult) {
doThirdThing(newResult, function(finalResult) {
console.log('Got the final result: ' + finalResult);
}, failureCallback);
}, failureCallback);
}, failureCallback);
不写这些功能。所以让我们写下来:
var failureCallback = function() {
console.log('something went wrong');
}
var doSomething = function(callback) {
window.setTimeout(function() {
var result = Date.now(); // Create some data that will change every time the function is invoked
callback(result);
}, 500);
}
var doSomethingElse = function(res, callback) {
window.setTimeout(function() {
var result = [res]; // all this function really does is put the first argument in an array
callback(result);
}, 500);
}
function doThirdThing(res, callback) {
window.setTimeout(function() {
res.push(Math.PI); // res is supposed to be an array, so we can add stuff to it.
var result = res;
callback(result); // here we could have used res as a value, but I kept it consistent
}, 500);
}
doSomething(function(result) {
doSomethingElse(result, function(newResult) {
doThirdThing(newResult, function(finalResult) {
console.log('Got the final result: ', finalResult); // switched to a comma to display properly in the console
}, failureCallback);
}, failureCallback);
}, failureCallback);

为了创造一些异步性,我使用了setTimeout
,所以你必须等待1.5秒。
使用回调函数作为参数的3个函数,只需执行它们给出的函数即可。这在JavaScript中是绝对标准的,其中函数是第一类对象:您可以将它们作为参数传递,就像任何其他值类型一样。