如何在Node.js中等待

如何在Node.js中等待,node.js,mongodb,coffeescript,Node.js,Mongodb,Coffeescript,下面是一个关于我认为在NodeJS中什么是简单模式的问题 以下是我在coffeescript中的示例: 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()

下面是一个关于我认为在NodeJS中什么是简单模式的问题

以下是我在coffeescript中的示例:

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循环从不放弃控制,我想这是有道理的。但是,如何告诉wait函数尝试队列中的下一个回调?

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

db.open(function() {
  // db is now open, let's run some more code
  execute_db_query();
});
基本上,您只需遵循中列出的模式。

我喜欢在有需要同步运行的代码位时使用

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')
  }
})

您不能等待,只能使用callback。您基本上是在问如何以同步方式编写asynchronous node.js代码,这是许多新项目和想法的热点问题。检查这个链接,它们是吨虽然:好吧,如果我只想打开连接池一次,那么你所做的是没有意义的。我熟悉回调模式。我的问题是应用程序的初始设置。应用程序需要在运行之前进行自我设置,这包括设置数据库,并且需要同步完成。也许这是不可能的,但是有没有办法让控制流返回到事件循环?而且你也不希望每次打开和关闭都是浪费。下面是Chris(编写你链接到的库的人)所说的“一般模式是在启动web框架之前打开db连接,然后让它保持打开状态。”也许我遗漏了什么,但为什么不在
db.open
回调中启动web框架呢?如果这还不能回答问题,你可能只想直接问他澄清一下。谢谢你的回答,但我想我上面描述的“等待模式”目前在Node.js中是不可能的。换句话说,这就像说,require(“somelib”),然后somelib必须设置一些异步资源。那么,导入该模块的代码如何知道“somelib”的设置是否已完成?无论模块必须设置什么IO资源,您都可以向其传递回调,它可以告诉您何时准备就绪。您永远不希望隐式地开始访问模块中的IO,用户不会喜欢这样。