gpt4 book ai didi

javascript - Node js返回回调函数中设置的全局变量

转载 作者:太空宇宙 更新时间:2023-11-04 01:49:57 24 4
gpt4 key购买 nike

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

全局变量可能很危险,你不需要它们。 promise 解决你的问题。您可以嵌套任意多个回调,但始终使用 resolvePromise 返回值。这是在 JavaScript 中执行此操作的标准现代方法。

用法:

getData().then((data)=>{console.log("Table data:",data);})
.catch((error)=>{console.log("ERROR LOADING SQL:",error);})

或者,在异步函数中:

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
}

关于javascript - Node js返回回调函数中设置的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50091811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com