【问题标题】:Variable outside of callback in NodeJSNodeJS中回调之外的变量
【发布时间】:2011-11-18 23:20:39
【问题描述】:

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

【问题讨论】:

  • 我不确定我是否理解。这些回调的重点是其余代码可以执行,而不必等待查询。因此,假设results 是最后一行中data 的一个元素没有多大意义,因为查询尚未完成。
  • 我认为我的设计是错误的,并希望有更好的解决方案。你知道如何在不使用回调的情况下使用 node-mysql 从查询中获取数据吗?
  • 听起来你想要同步代码,让函数等待查询结束。我不确定这是最好的方法。你有什么理由不只是在回调中执行查询的依赖项?
  • 好吧,我可能会在我的应用程序开始时一直编写 2-3 个查询。我不想深入嵌套到回调中。

标签: javascript node.js closures


【解决方案1】:

您要求的是同步(或阻塞)执行,这确实与 node.js 的设计和精神背道而驰。

Node 和 JavaScript 一样,是单线程的。如果您有阻塞代码,那么整个过程都会停止

这意味着您必须对需要很长时间的任何事情使用回调(例如从数据库中查询)。如果您正在编写一个一次性运行的命令行工具,您可能愿意忍受阻塞。但是,如果您正在编写任何类型的响应式应用程序(例如网站),那么阻止就是谋杀。

因此,可能有人可以为您提供有关如何使其成为阻塞同步调用的答案。如果是这样,并且如果您实施它,那么您做错了。您也可以使用多线程脚本语言,例如 Ruby 或 Python。

编写回调并不是那么糟糕,但它需要以不习惯这种风格的人可能不熟悉的方式考虑架构和封装。

【讨论】:

  • 我来自 PHP 背景,这可能是我感到困惑的原因。看来我需要重新考虑在使用 NodeJS 时如何构建应用程序。谢谢
  • nodeJS 是一个不同的范例,不要尝试像同步系统一样对其进行编码,回调是允许尽可能快地运行(非阻塞)。一开始有点难,但仍然比尝试用 C、Java 或 PHP 等语言实现异步代码要容易得多
【解决方案2】:

Node.js 将Continuation Passing Style 用于它的所有异步接口。围绕这个和modules 有很多讨论很多,这些讨论是为了缓解嵌套回调的痛苦而创建的。有一段时间有传言说 node.js 可能会开始在 v0.7.x 分支的核心中重新引入 Promises,但我不确定这是否属实。

如果不使用上面链接中的流控制库之一(或滚动您自己的),您要么必须忍受嵌套回调,要么只需为回调提供函数引用。例如,

var data = [],
    handler = function(err, results, fields) {
        if (err) {
          throw err;
        }
        ...
    };
client.query('SELECT * FROM cds', handler);

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多