了解嵌套回调执行序列



这里的初学者试图围绕嵌套回调进行思考。

在这个MDN页面上,给出了一个示例,说明如何将几个异步函数链接在一起(过去)需要这个臭名昭著的厄运回调金字塔:

doSomething(function(result) {
doSomethingElse(result, function(newResult) {
doThirdThing(newResult, function(finalResult) {
console.log('Got the final result: ' + finalResult);
}, failureCallback);
}, failureCallback);
}, failureCallback);

好吧,所以我只是想解决这个问题,我不能放手。

据我所知,我正在查看一个doSomething()高阶函数调用,它有一个(匿名)回调函数声明为其参数,而该函数又包含第二个函数调用doSomethingElse(),它有另一个(匿名)回调函数声明为参数,包含对第三个函数的调用doThirdThing()......等等。

简而言之,这里有三个嵌套函数调用:doSomething()doSomethingElse()doThirdThing()。其中每个都有一个匿名函数声明为输入参数。

为了掌握它是如何工作的,我尝试编写我自己的"厄运金字塔",没有任何失败回调参数来保持简单:

function someThing() {
console.log("Do Something!");
}

function someThingElse () {
console.log("Do Something Else!");
}

function doThirdThing () {
console.log("Do Third thing!");
}

someThing(function(){
console.log("First anonymous callback!");
someThingElse(function(){
console.log("Second anonymous callback!")
doThirdThing(function() {
console.log("Third anonymous callback!");
})
})
})

当我运行此代码时,打印到控制台的所有内容都Do Something!

我不明白为什么没有运行someThingElsedoThirdThing,也没有运行任何匿名回调函数?

我在这里错过了什么?请帮忙!

您的函数无法接受回调参数,并且无法在完成时实际调用它。 也就是说,这通过某种魔法不起作用,您需要实际调用函数。

function someThing(callback) {
console.log("Do Something!");
callback();
}
function someThingElse (callback) {
console.log("Do Something Else!");
callback();
}
function doThirdThing (callback) {
console.log("Do Third thing!");
callback();
}
someThing(function(){
console.log("First anonymous callback!");
someThingElse(function(){
console.log("Second anonymous callback!")
doThirdThing(function() {
console.log("Third anonymous callback!");
})
})
})

你正在调用someThing( ... ),但你正在传递给它一个函数,对吧?但是,声明function someThing()没有任何论据。所以它对你传递的东西没有任何作用。

你需要你的函数声明来接受一个参数(另一个函数,这将是回调),然后执行它:

function someThing(callback) {
console.log("Do Something!");
callback();
}
function someThingElse (callback) {
console.log("Do Something Else!");
callback();
}
function doThirdThing (callback) {
console.log("Do Third thing!");
callback();
}
someThing(function(){
console.log("First anonymous callback!");
someThingElse(function(){
console.log("Second anonymous callback!")
doThirdThing(function() {
console.log("Third anonymous callback!");
})
})
})

最新更新