NodeJS中回调之外的变量

时间:2011-09-16 20:03:43

标签: javascript node.js closures

我对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?在运行查询时,我不想在彼此内部写入大量的回调。

2 个答案:

答案 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);