返回回调?

时间:2019-07-13 18:24:45

标签: node.js discord.js

在测试与数据库的连接之后,我尝试return,以便它不会运行脚本的其余部分。这可能吗?

我调用的第一个函数


    testcon: function (callback)
    {
        var con = mysql.createConnection({
            host: sqlhost,
            user: sqluser,
            password: sqlpass,
            database: sqldb
        })
        con.connect(function(err) {
            if (err) {
              return callback(false)
            }
            return callback(true)
        });
    }

我在这里叫



    db.testcon(function (result){
        if(!result && msg.content.startsWith("!"))
        {
            return msg.channel.send("I'm not connected to my main database. I can't do anything for you, as of now. :(")
        }
    })
    console.log("He ran me, ti-hi.")

我不希望执行b“ console.log()”行,但是确实如此。我该如何解决?

1 个答案:

答案 0 :(得分:2)

如果您觉得这很荒谬(您在注释中使用的词),那是因为您尚未了解node.js中的异步操作如何工作,内联异步回调如何工作以及如何在node中对其进行编程。 js完成您的任务。我建议您多读一些有关node.js是如何由事件驱动的,如何以单线程方式运行Javascript,如何使用非阻塞I / O操作以及如何使用它进行编程的文章。

Node.js使用非阻塞的异步操作进行网络I / O。这意味着您的其余代码将在异步操作进行期间继续运行,并且异步操作完成后您需要执行的所有操作应在CALLBACK本身(或在从回调函数调用的某些函数中)进行。这就是node.js的工作方式。

比普通的回调(例如promise)更先进的工具,然后将asyncawait与promise一起使用,但是异步体系结构仍然存在,所有这些概念仍然存在。

在特定情况下,您需要将操作完成后想要发生的任何逻辑放入回调本身中。

testcon: function (callback) {
    var con = mysql.createConnection({
        host: sqlhost,
        user: sqluser,
        password: sqlpass,
        database: sqldb
    });
    // just communicate back the error, allow the caller to see the actual error
    con.connect(callback);
}


db.testcon(function (err) {
    if(err) {
        msg.channel.send("I'm not connected to my main database. I can't do anything for you, as of now. :(");
    } else {
        // log here so it happens when the connect has completed
        console.log("He ran me, ti-hi.");
    }
});

还要记住,在回调内部执行return只会从该回调中返回。它不是return来自可能从中调用过的任何更高级别的函数。而且,如果您将return放入的回调是异步回调,则从中调用的更高级别的函数可能已经返回并继续运行。它没有等待这个非阻塞回调被调用。