2014-08-29 22 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