javascript中的嵌套回调

时间:2014-03-31 19:17:16

标签: javascript callback

我在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();
   });  
 });
});

结果(在不正确的情况下),我没有按照我想要的方式获取结果,因为断言无法“赶上”

感谢所有人的启发;)

2 个答案:

答案 0 :(得分:0)

您的console.log调用不是回调的一部分,因此只要进行了getConnection调用,就会调用它。如果您希望仅在回调getConnection后触发它,则需要在该调用结束时调用它,或者需要使用某种形式的promises

答案 1 :(得分:0)

Javascript是单线程的,但确实使用了任务队列。当数据库连接被实例化并且池连接到时,对它的响应被放入任务队列中以便在完成时执行或操作。

直接将其放入任务队列后,下一条执行是执行“哦不”的日志 - 很好的消息btw lol。

基本上发生的事情是db调用被放置在任务队列中以便以后执行,然后发生日志,然后任务队列稍后用db响应执行。