Javascript 如何调用3或4个回调函数

Javascript 如何调用3或4个回调函数,javascript,Javascript,我需要了解回调函数是如何工作的。 我用两个函数编写了这个小脚本: function fn1(callback) { alert('fn1'); callback(); } function fn2() { alert('fn2'); } fn1(fn2); //display 'fn1' then 'fn2' 现在,我想用“fn3”函数更新我的脚本,以便显示“fn1”然后是“fn2”然后是“fn3”。我试过这个: function fn1(callback) { alert

我需要了解回调函数是如何工作的。 我用两个函数编写了这个小脚本:

function fn1(callback) {
  alert('fn1');
  callback();
}

function fn2() {
  alert('fn2');
}

fn1(fn2); //display 'fn1' then 'fn2'
现在,我想用“fn3”函数更新我的脚本,以便显示“fn1”然后是“fn2”然后是“fn3”。我试过这个:

function fn1(callback) {
  alert('fn1');
  callback();
}

function fn2(callback) {
  alert('fn2');
  callback();
}

function fn3() {
  alert('fn3');
}

fn1(fn2(fn3));
但它先显示'fn2',然后显示'fn3',然后显示'fn1',然后记录错误(“回调不是函数”)。 有什么想法吗?怎么了? 先谢谢你,弗洛伦特

fn3

取值
fn3
,这是一个函数

fn2(fn3)

将该值作为参数传递给调用的另一个函数
fn2

函数fn2(回调){alert('fn2');callback();}

您发出警报,然后将参数(您从
fn3
获得的函数)作为函数调用(我将跳过它的详细功能),然后返回
undefined
(因为您没有return语句)

fn1(fn2(fn3))

由于
fn2(fn3)
返回
undefined
这与
fn1(undefined)
相同

函数fn1(回调){alert('fn1');callback();}

您发出警报,然后尝试将
undefined
作为一个函数调用,但它不是,因此它会出错


如何调用3或4个回调函数

可能…重写函数,使其使用而不是普通的旧回调

但是,在您的示例中使用回调毫无意义,真正问题的最佳解决方案将取决于该问题是什么。

fn1(fn2(fn3))

这里我们有一个对函数
fn1
的调用,其中有一个参数是函数
fn2
的返回值。对该语句求值,以便首先使用其参数
fn3
调用
fn2
,然后将返回值传递给
fn1
fn2
调用其参数。这就是为什么您会收到“意外”的警报顺序


fn2
不返回任何内容,因此您从
fn1
中得到错误,这听起来更像是您在寻找的

函数fn1(){
返回新承诺(解决=>{
警报(“fn1”);
解决()
});
}
函数fn2(){
返回新承诺(解决=>{
警报(“fn2”);
解决()
});
}
函数fn3(){
返回新承诺(解决=>{
警报(“fn3”);
解决()
});
}

fn1().然后(fn2).然后(fn3)为了执行
f1
然后
f2
然后
f3
,您需要创建一个回调函数,以确保函数将分步执行

错:

fn1(fn2(fn3))) // this first call f2 with f3 as parameter then calls f1 with its result
对:

fn1(function () { // call f1
  fn2(function () { // then call f2 after f1
    fn3(); // then call f3 after f2
  })
})

问题是
fn2(fn3)
执行fn2,然后f1接收该函数的结果作为其参数,而不是函数引用本身。这里的想法是什么?fn2是否应该始终知道它必须调用fn3,或者您是否希望指定每次回调的顺序,并让它们以动态定义的顺序执行?我之所以这样问是因为,如果是后者,实际上根本不需要任何回调,您可以按顺序执行函数。这样做的唯一原因是,如果现实生活中的部分/全部是异步的,那么您需要等到它们完成后再继续。