我是Node的新手,显然正在努力应对回调概念。如何在查询完成后才返回数组?我已经看到类似的节点与mssql模块示例,但我没有解决我的问题
function myFunction () {
var arr = [];
var connection = new sql.Connection(dbConfig, function (err) {
var request = new sql.Request(connection);
request.query('select top 10 Name from User', function (err, recordset) {
if (err) {
console.log('error');
}
for (var id in recordset) {
arr.push(recordset[id]["Name"]);
}
});
});
};
myFunction ();
最终,我想以数组或JSON格式“返回”结果集,以便我可以更轻松地使用它。
答案 0 :(得分:0)
在Node中,您可以返回的两种主要(但不仅仅是!)方式。来自异步函数的是:
与request.query
如何将回调作为参数类似,您也可以这样做:
function myFunction(cb) {
var arr = [];
var connection = new sql.Connection(dbConfig, function (err) {
var request = new sql.Request(connection);
request.query('select top 10 Name from User', function (err, recordset) {
if (err) {
console.log('error');
cb(err, null);
return;
}
for (var id in recordset) {
arr.push(recordset[id]["Name"]);
}
cb(null, arr);
});
});
};
请注意我是如何遵循与其他Node回调相同的约定 - 将错误作为第一个参数,将返回的数据作为第二个参数。有了这个,你就可以使用你的功能:
myFunction(function (err, data) {
if (err) {
/* error handling */
}
/* do stuff with data here */
});
围绕异步的一个更现代的抽象是Promises - 这些表示将作为对象发生的异步事件,它将被解析或拒绝。以下是如何将此模式应用于您的函数:
function myFunction() {
return new Promise(function (resolve, reject) {
var arr = [];
var connection = new sql.Connection(dbConfig, function (err) {
var request = new sql.Request(connection);
request.query('select top 10 Name from User', function (err, recordset) {
if (err) {
console.log('error');
reject(err);
return;
}
for (var id in recordset) {
arr.push(recordset[id]["Name"]);
}
resolve(arr);
});
});
});
};
然后,您可以将.then
和.catch
链接到返回的Promise上以处理结果:
myFunction()
.then(function (data) {
/* ... */
})
.catch(function (err) {
/* ... */
});
这两个例子都非常基础 - 你可以做更多的事情,特别是在谈到Promises时(非常适合将大量异步内容链接在一起)。我鼓励您进一步研究这两种选择。