【问题标题】:How to Wait in Node.js如何在 Node.js 中等待
【发布时间】:2012-02-11 12:07:37
【问题描述】:

这是一个关于我认为节点 js 中的简单模式的问题。

这是我在咖啡脚本中的示例:

db_is_open = false

db.open ->
  db_is_open = true

wait = ->
wait() until db_is_open

在 javascript 中再次出现:

var db_is_open = false;

db.open(function() {
  db_is_open = true;
});

function wait() {};
while (not db_is_open) { wait()};

这根本不起作用,因为 while 循环永远不会放弃控制,我想这是有道理的。但是如何告诉等待函数尝试队列中的下一个回调?

【问题讨论】:

标签: node.js mongodb coffeescript


【解决方案1】:

当我有一些需要同步运行的代码时,我喜欢使用async module

var async = require('async');

async.series([
  function(next){
    db.open(next)
  }
, function(next){
    db.loadSite('siteName', next)
  }
], function(err){
  if(err) console.log(err)
  else {
    // Waits for defined functions to finish
    console.log('Database connected')
  }
})

【讨论】:

    【解决方案2】:

    您为什么要等待,而不仅仅是使用在传递给db.open 的函数内部运行的回调?这是非常惯用的 Node 代码:

    db.open(function() {
      // db is now open, let's run some more code
      execute_db_query();
    });
    

    基本上,您只需遵循the documentation 中列出的模式即可。

    【讨论】:

    • 好吧,如果我只想打开一次连接池,那么你所做的就没有意义了。我熟悉回调模式。我的问题是应用程序的初始设置。应用程序需要在运行任何东西之前进行自我设置,这包括设置数据库,并且需要同步完成。也许这是不可能的,但有没有办法让控制流返回事件循环?
    • 另外你不想每次都打开和关闭很浪费。这是克里斯(编写您链接到的库的人)所说的“一般模式是在启动 Web 框架之前打开数据库连接,然后将其保持打开状态。” here
    • 也许我遗漏了一些东西,但为什么不在db.open 回调中启动Web 框架呢?如果这没有回答,你可能只想直接问他澄清。
    • 感谢您的回复,但我想我上面描述的“等待模式”目前在 Node.js 中是不可能的。换一种说法,就像说 require("somelib"); ,然后 somelib 有一些它必须设置的异步资源。那么我正在导入该模块的代码如何知道“somelib”是否已完成设置?
    • 无论您的模块必须设置什么 IO 资源,您都可以将回调传递给它,它会告诉您何时准备就绪。你永远不想在你的模块中隐式开始访问 IO,用户不会喜欢这样。
    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2021-02-05
    • 2021-06-02
    相关资源
    最近更新 更多