2012-01-16 103 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') 
    } 
})