【问题标题】:Wrapping my head around callbacks in Node.js围绕 Node.js 中的回调进行思考
【发布时间】:2013-01-27 23:23:39
【问题描述】:

我只是在尝试一个简单的回调来让代码按顺序执行,而不是异步执行。这不起作用:

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 中执行此操作的最佳方式吗?

【问题讨论】:

  • 在您的第一个示例中从 fn2 中删除 ()。您正在调用该函数,而不是传递它。
  • 在您的第一个示例中,在 fn1 方法调用中将 fn2() 替换为 fn2fn2() 将评估,记录“世界”,然后将返回 undefined 作为 fn1 的回调传递
  • fn1 是异步的吗?如果您传递给它的函数是同步的,则您不必使用回调。您可以在调用第一个函数后调用第二个函数。

标签: javascript node.js


【解决方案1】:

看看你的最后一行:

fn1("meaninglessString", fn2());

应该改为:

fn1("meaninglessString", fn2);

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

【讨论】:

  • 那行得通。但问题仍然存在,这是在 Node.js 中控制执行顺序的最佳方式吗?
  • 简单地说:是的。这正是你应该做的。此外,您将无法使用 node.js 避免这种事情。大多数系统调用(在其他语言中可能会阻塞)是异步的,并且需要传递回调才能对它们做任何有用的事情。 howtonode.org/control-flow 有一些有趣的示例代码。
【解决方案2】:

在您的第一个区块中,您有:

fn1("meaninglessString", fn2());

这表示“调用 fn1 时使用参数“meaninglessString”以及调用 fn2 时不使用参数的结果”。因此,解释器执行它调用 fn2 并从中得到任何回报,它将“world”打印为副产品,然后使用参数“meaninglessString”和 undefined 调用 fn1,后者打印“hello”并调用尚未被调用的函数set(undefined) 因此它崩溃了。

如果您更改代码以传递函数而不是调用函数的结果,如下所示,它将按预期工作

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

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

fn1("meaninglessString", fn2);

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2023-03-25
    • 2011-07-10
    • 2011-09-22
    • 1970-01-01
    相关资源
    最近更新 更多