![](/img/trans.png)
[英]Node JS How to access global variable from Callback function of a function?
[英]node js to return global variable set in callback function
我在javascript
有2個函數,我想在回調中設置全局變量,然后從主函數返回它。 我知道javascript本質上是異步的,那么執行此操作的最佳方法是什么? 我有下面的代碼:
var results="";
function getData() {
var sql = require("mssql");
var dbConfig={
server:"server",
database: "db",
user:"user",
password: "pw"
}
var conn = new sql.Connection(dbConfig);
var req = new sql.Request(conn);
conn.connect(function (err){
if (err) {
console.log(err);
return;
}
req.query("SELECT * FROM table",resultsCallback)
conn.close();
});
return results;
}
function resultsCallback (err, recordset) {
var tableify = require('tableify');
if (err) {
console.log(err);
}
else {
var html = tableify(recordset);
html = html.replace('<table>','');
html = html.replace('</table>',');
results=html;
}
};
沒有正確的方法來執行此操作,因為您要執行的操作不正確。 您試圖在獲取值之前返回一個值。 而且您正在使用全局變量,這對於您的代碼可能是危險的。
我了解您為什么要嘗試使用全局變量從回調中獲取結果,但是它不起作用。
當代碼return results;
執行時,SQL查詢甚至尚未啟動,因此它返回""
。
而是使用Promise
:
function getData() {
return new Promise((resolve, reject) => {
var sql = require("mssql");
var dbConfig = {
server: "server",
database: "db",
user: "user",
password: "pw"
}
var conn = new sql.Connection(dbConfig);
var req = new sql.Request(conn);
conn.connect(function (err) {
if (err) {
console.log(err);
reject(err);
return;
}
req.query("SELECT * FROM table",
(err, recordset) => {
// Here we call the resolve/reject for the promise
try {
// If the results callback throws exception, it will be caught in
// the catch block
resolve(resultsCallback(err, recordset));
}
catch (e) {
reject(e);
}
}
);
conn.close();
});
})
}
function resultsCallback(err, recordset) {
var tableify = require('tableify');
if (err) {
console.log(err);
throw err;
}
else {
var html = tableify(recordset);
html = html.replace('<table>', '');
html = html.replace('</table>', '');
return html;
}
};
全局變量可能很危險,您不需要它們。 承諾解決您的問題。 您可以嵌套許多回調,但是您始終使用resolve
從Promise
返回值。 這是在JavaScript中執行此操作的標准現代方法。
用法:
getData().then((data)=>{console.log("Table data:",data);})
.catch((error)=>{console.log("ERROR LOADING SQL:",error);})
或者,在async
函數中:
async function doSomethingWithData() {
console.log("Start loading data.");
const data = await getData();
console.log("Done loading data.");
// your results are in the data variable now
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.