我在javascript中嵌套回调有一个小问题。显然我做错了什么,但我做了我的研究,并尝试按照整个网络上的教程。我知道我的代码有效,因为查询返回正确的数据,但我不知道为什么我的代码在executeQuery
方法中没有“等待”,直到从数据库中取出res
,它才直接进入“哦,不,“部分。
DatabaseConnection.prototype.executeQuery = function(query, executeQueryDone){
var activeConnection;
console.log("YEAAA, executing Query: " + query);
this.pool.getConnection(function (err, connection){
console.log("Got Connection, we are ready to go!");
if (err){
console.log("Error, DAMMNIT! " + err);
executeQueryDone(err);
}
activeConnection = connection;
activeConnection.connect();
activeConnection.query(query, function(error, res){
console.log("Connection from pool is executing Query");
if(error){
console.log("Error during executing query");
executeQueryDone(error);
}
else {
console.log(" OK now release connection (dont be selfish)! ");
activeConnection.release();
executeQueryDone(null, res);
}
});
});
console.log("oh noes! IM AFTER CONNECTION, why dude? WHY???? ");
};
自从昨天以来我一直在努力解决任何暗示,我将不胜感激。
=====================
describe('testDB2', function () {
it('should return proper STUFF', function (done) {
assert.equal(1, someService.getStuff(function(err, result){
if (err === null){
console.log("err is null, as it should be!");
}
console.log(" result from DB " + result[1].NUMBERS);
}));
});
});
虽然应该是这样的:
describe('testDB2', function () {
it('should return proper STUFF', function (done) {
someService.getStuff(function(err, result){
assert.equal(err, null);
assert.equal(result[1].NUMBERS, 43637654);
done();
});
});
});
结果(在不正确的情况下),我没有按照我想要的方式获取结果,因为断言无法“赶上”
感谢所有人的启发;)
答案 0 :(得分:0)
您的console.log调用不是回调的一部分,因此只要进行了getConnection调用,就会调用它。如果您希望仅在回调getConnection后触发它,则需要在该调用结束时调用它,或者需要使用某种形式的promises。
答案 1 :(得分:0)
Javascript是单线程的,但确实使用了任务队列。当数据库连接被实例化并且池连接到时,对它的响应被放入任务队列中以便在完成时执行或操作。
直接将其放入任务队列后,下一条执行是执行“哦不”的日志 - 很好的消息btw lol。
基本上发生的事情是db调用被放置在任务队列中以便以后执行,然后发生日志,然后任务队列稍后用db响应执行。