我对NodeJS和JavaScript都很新。这是我的剧本:
var data = [];
client.query(
'SELECT * FROM cds',
function selectCb(err, results, fields) {
if (err) {
throw err;
}
console.log(results);
console.log(fields);
data.push(results);
}
);
console.log(data);
如何在回调之外访问results
(或data
)var?在运行查询时,我不想在彼此内部写入大量的回调。
答案 0 :(得分:1)
你要求的是同步(或阻塞)执行,这与node.js的设计和精神完全相反。
Node与JavaScript一样,是单线程的。如果你有阻止代码,那么整个过程就会停止。
这意味着你必须对需要很长时间的任何事情使用回调(比如从数据库中查询)。如果您正在编写一个通过的命令行工具,那么您可能愿意接受阻塞。但如果您正在编写任何类型的响应式应用程序(如网站),那么阻止就是谋杀。
所以可能有人可以给你一个如何使其成为阻塞同步调用的答案。如果是这样,如果你实施它,你做错了。您也可以使用Ruby或Python等多线程脚本语言。
编写回调并不是那么糟糕,但它需要一些关于架构和封装的思考,对于那些不习惯这种风格的人来说可能并不熟悉。
答案 1 :(得分:1)
Node.js将Continuation Passing Style用于所有异步接口。围绕这个和modules进行讨论的很多是为缓解嵌套回调的痛苦而创建的。有传言说node.js可能会开始将Promise重新引入v0.7.x分支的核心,但我不确定这是不是真的。
如果不使用上面链接中的一个流控制库(或自己滚动),您将不得不接受嵌套回调,或者只是为回调提供函数引用。如,
var data = [],
handler = function(err, results, fields) {
if (err) {
throw err;
}
...
};
client.query('SELECT * FROM cds', handler);