2014-08-29 61 views
0

我正在使用npm包“mssql” 为了打开连接。我必须这样做:在类初始化程序中为node.js解决回调问题

var getOneToken = function (callback) { 
    var token = ""; 

    var connection = new sql.Connection(dbConfig, function(err){ //<-----line 3 
     if(err) console.log(err); 

     var sqlrequest = new sql.Request(connection); 

     sqlrequest.query('select top 1 [accessToken] from AccessToken', function(err, recordset){ 
      if(err) console.log(err); 

      token = recordset[0]['accessToken']; 

      connection.close(); 

      callback(token); 
     }) 
    }); 
    //how to await the whole block at the top and prevent early execution of code afterwards. 
}; 

该块中的代码需要延迟,直到数据库返回结果,这是令牌。 然后可以进行进一步的操作。

我不知道如何等待代码。

因为我想:

connection = await { new sql.Connection(dbConfig, defer (var err)) } 

它失败。因为tamejs不允许您将关键字“等待”放在那里。

我也用蓝鸟asyncawait库,但是,它是很难拉平整个街区 和阶级“等待”初始化尤其是对第3行

如何处理这个问题?

+0

对不起,我还是没有意识到问题是什么。你从SQL获得一个令牌;那么你想怎么做?什么具体阻止你这样做?还是仅仅是你不了解回调和延续传球的事实? – Amadan 2014-08-29 07:03:48

+0

@Amadan我必须使用回调来传递'返回值',我发现没有任何工具可以等待第3行的块。因为我总是在调用这段代码后打印'undefined'值。我仍然不熟悉延续传球风格... – CodeFarmer 2014-08-29 07:19:26

+0

你不能等。这不是节点的工作原理。将值赋给'callback',就像代码已经做的那样。忘记“返回”。 'return'只对你可以立即回馈的东西有用;如果你需要等待,那就是'callback'的作用。所有的异步库(async,await ...)只是简化了几个回调的同步,并不适用于你正在做的任何事情。 Tamejs实际上不是JavaScript。所以,我再次问:在“等待”之后你想做什么? “回报价值”不是一个答案,认为更大。你想要什么令牌? – Amadan 2014-08-29 07:23:50

回答

1
function sqlConnect(dbConfig, cb) { 
    var conn = new sql.Connection(dbConfig); 
    conn.connect(function (err) { 
    cb(err, conn); 
    }); 
} 

用法:

sqlConnect(dbConfig, function (err, conn) { 
    // do your stuff here 
}); 

或者使用tamejs:

var err, conn; 
await { sqlConnect(dbConfig, defer(err, conn); } 
// do your stuff here 

布局回调,你可能还需要看看async


更新:如果你想要什么t只是避免回调链,你不需要提取一个新的建立连接的函数。相反,你可以像这样重写你的功能:

var getOneToken = function (dbConfig, cb) { 
    var err, recordset; 
    var token = ""; 

    var conn = new sql.Connection(dbConfig); 

    await { conn.connect(defer(err)); } 
    if (err) { 
     console.log(err); 
     cb(token); 
     return; 
    } 

    var request = new sql.Request(conn); 
    await { request.query('select top 1 [accessToken] from AccessToken', defer(err, recordset)); } 
    if (err) { 
     console.log(err); 
    } else { 
     token = recordset[0]['accessToken']; 
    } 

    conn.close(); 
    cb(token); 
}; 
+0

您最后一段代码使用'defer(err,conn)',但为了关闭连接。你必须知道连接的名称。因此,var connection = new sql.Connection(dbConfig,function(err){...}。另外,如果您查看https://www.npmjs.org/package/mssql,则在回调中没有“conn”。 – CodeFarmer 2014-08-29 07:24:46

+0

@CodeFarmer查看'sqlConnect'的实现,首先新建一个没有回调的连接,所以你可以在连接之前先获得'conn',然后在'conn'上调用'connect',用一个只接受单个'err'参数。lambda调用'cb(err,conn)',这样你就可以在'cb'中得到'conn'。 – Chen 2014-08-29 08:57:38