在Node.js中理解回调函数

3

我只是尝试一个简单的回调来按顺序执行代码而不是异步执行。这种方法行不通:

function fn1(string, func){
    console.log("hello");
    func();
};

function fn2(){
    console.log("world");
}

fn1("meaninglessString", fn2());

实际上,它会先在控制台打印“world”,然后再打印“hello”,最后崩溃。但是以下代码不会导致崩溃:
function fn1(string, func){
    console.log("hello");
    func();
};

fn1("meaninglessString", function(){
    console.log("world");
});

我是否必须总是在调用fn1时编写回调函数代码,还是有一种方法可以引用已经编写的函数? 另外,如果我只想让一个函数在另一个函数完成后发生,这是在Node.js中进行此操作的最佳方式吗?


1
在你的第一个例子中,从fn2中删除()。你是在调用函数,而不是传递它。 - numbers1311407
在您的第一个示例中,在fn1方法调用中将fn2()替换为fn2fn2()将会被执行,记录"world",然后返回undefined,这个undefined作为fn1的回调函数传递了进去。 - Cecchi
fn1是异步的吗?如果您传递给它的函数是同步的,那么您不必使用回调函数。您只需在调用第一个函数后直接调用第二个函数即可。 - bfavaretto
2个回答

6

请看一下您的最后一行:

fn1("meaninglessString", fn2());

应该改为以下内容:
fn1("meaninglessString", fn2);

包括括号会导致fn2立即执行。

那个起作用了。问题仍然存在,不过这是否是在Node.js中控制执行顺序的最佳方式呢? - Jason Burgett
简单来说:是的。这就是你应该做的方式。此外,你无法避免在使用Node时遇到这种情况。大多数系统调用(在其他语言中可能是阻塞的)都是异步的,并且需要传递回调函数才能对其进行有意义的操作。http://howtonode.org/control-flow 上有一些有趣的示例代码。 - Thomas

2
在你的第一个区块中,你有:
fn1("meaninglessString", fn2());

这段代码意味着“使用参数“meaninglessString”和调用没有参数的fn2的结果来调用fn1”。因此,解释器会这样做:它首先调用fn2并从中得不到任何结果,然后打印出"world"作为附带产物,接着将“meaninglessString”和undefined作为参数调用fn1,打印出"hello"并调用一个未定义的函数,导致程序崩溃。
如果你将代码更改为以下形式,传递函数而不是调用函数的结果,那么它就会按照你的预期工作。
function fn1(string, func){
    console.log("hello");
    func();
};

function fn2(){
    console.log("world");
}

fn1("meaninglessString", fn2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接