2012-01-16 61 views
8

下面是一个关于我认为会是节点js中简单模式的问题。如何在Node.js中等待

这是我在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函数尝试队列中的下一个回调?

+3

你不能等待,您只能使用回调 – Raynos 2012-01-16 15:22:01

+2

你基本上是问如何编写异步代码的Node.js以同步的方式,这是一个热点问题,有很多新的计划和想法。检查这个链接,他们是吨虽然:http://stackoverflow.com/questions/5139381/node-js-async-libs – tokland 2012-01-16 16:19:03

回答

2

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

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

基本上,你应该简单地遵循the documentation布局模式。

+1

那么,如果我只想打开连接池一次,那么你在做什么是没有意义的。我熟悉回调模式。 我的问题是应用程序的初始设置。应用程序需要在运行任何内容之前进行设置,这包括设置数据库,并且需要同步完成。 也许这是不可能的,但有什么办法让控制流回到事件循环? – 2012-01-16 17:08:58

+1

你也不想每次都浪费时间打开和关闭。下面是Chris(编写链接库的人)说的:“一般模式是在启动Web框架之前打开数据库连接,然后将其打开。” [这里](https://github.com/christkv/node-mongodb-native/issues/477) – 2012-01-16 17:12:21

+2

也许我错过了一些东西,但为什么不直接在'db.open'回调中启动web框架呢?如果没有回答,你可能只是想直接问他澄清。 – 2012-01-16 17:14:07

4

我喜欢使用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') 
    } 
})