我遇到匿名函数节点js的问题,想知道如何从异步函数中获取数据。这样它返回空的web api,因为它在异步调用sqlite
结束之前返回restapi.get('/data', function(req, res){
var array = [];
db.each("SELECT value FROM counts", function(err, row){
array.push(row);
});
res.json(array);
});
有人可以解释一下它的工作原理和解决方法吗?谢谢
答案 0 :(得分:3)
这是使用回调进行异步编程的重点。异步函数(而不是返回结果)接受回调,该回调将在作业完成后立即触发。回调将接收异步工作的结果作为其参数。
不要指望异步函数返回任何内容。相反,将结果处理逻辑嵌套在传递给该函数的回调中。
因此,你的剪辑看起来应该是这样的:
restapi.get('/data', function(req, res){
var array = [];
db.each("SELECT value FROM counts", function(err, row) {
if (row) {
array.push(row);
}
else {
res.json(array); // When there are no more rows
}
});
});
使用平面回调非常痛苦。无休止的嵌套往往会使代码混乱很多。如果命名回调,可以自助,并使用命名版本而不是嵌套。那只会让你到目前为止。更好的解决方案是使用像async这样的控制流库。但是,要使其工作,所有回调必须是可组合的 - 也就是说,遵循接受错误对象作为第一个参数的约定。例如,请参阅this explaination。