在测试与数据库的连接之后,我尝试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()”行,但是确实如此。我该如何解决?
答案 0 :(得分:2)
如果您觉得这很荒谬(您在注释中使用的词),那是因为您尚未了解node.js中的异步操作如何工作,内联异步回调如何工作以及如何在node中对其进行编程。 js完成您的任务。我建议您多读一些有关node.js是如何由事件驱动的,如何以单线程方式运行Javascript,如何使用非阻塞I / O操作以及如何使用它进行编程的文章。
Node.js使用非阻塞的异步操作进行网络I / O。这意味着您的其余代码将在异步操作进行期间继续运行,并且异步操作完成后您需要执行的所有操作应在CALLBACK本身(或在从回调函数调用的某些函数中)进行。这就是node.js的工作方式。
比普通的回调(例如promise)更先进的工具,然后将async
和await
与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
放入的回调是异步回调,则从中调用的更高级别的函数可能已经返回并继续运行。它没有等待这个非阻塞回调被调用。