2012-01-16 28 views
8

Đây là câu hỏi về những gì tôi nghĩ sẽ là một mẫu đơn giản trong nút js.Cách chờ ở Node.js

Dưới đây là ví dụ của tôi trong coffeescript:

db_is_open = false 

db.open -> 
    db_is_open = true 

wait = -> 
wait() until db_is_open 

Và đây một lần nữa trong javascript:

var db_is_open = false; 

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

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

này không làm việc ở tất cả vì vòng lặp while không bao giờ tuyên bố từ bỏ quyền kiểm soát, mà tôi đoán có ý nghĩa . Tuy nhiên làm thế nào tôi có thể nói cho các chức năng chờ đợi để thử gọi lại tiếp theo trong hàng đợi?

+3

Bạn không thể chờ đợi, bạn chỉ có thể sử dụng callbacks – Raynos

+2

bạn đang yêu cầu cơ bản làm thế nào để viết mã Node.js không đồng bộ trong một thời trang đồng bộ, mà là một vấn đề nóng bỏng với rất nhiều dự án và ý tưởng mới. Kiểm tra liên kết này, họ là tấn mặc dù: http://stackoverflow.com/questions/5139381/node-js-async-libs – tokland

Trả lời

2

Tại sao bạn chờ đợi và không chỉ sử dụng gọi lại chạy bên trong chức năng được chuyển đến db.open? Đây là mã Node khá thành ngữ:

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

Về cơ bản, bạn chỉ cần làm theo các mẫu được đặt ra trong the documentation.

+1

Vâng, nếu tôi chỉ muốn mở hồ bơi kết nối một lần thì những gì bạn đang làm sẽ không có ý nghĩa . Tôi quen thuộc với mẫu gọi lại. Vấn đề của tôi là với thiết lập ban đầu của ứng dụng. Ứng dụng cần thiết lập chính nó trước khi bất cứ điều gì có thể được chạy, điều này bao gồm thiết lập cơ sở dữ liệu, và nó cần phải được thực hiện đồng bộ. Có thể điều này là không thể nhưng có cách nào để kiểm soát dòng chảy trở lại vòng lặp sự kiện không? –

+1

Ngoài ra, bạn không muốn mở và đóng mỗi khi nó lãng phí. Đây là những gì Chris (người đã viết thư viện mà bạn liên kết) nói "Mẫu chung là mở kết nối db trước khi bạn bắt đầu khung web và sau đó để nó mở." [ở đây] (https://github.com/christkv/node-mongodb-native/issues/477) –

+2

Có lẽ tôi đang thiếu một cái gì đó, nhưng tại sao không chỉ bắt đầu khuôn khổ web trong gọi lại 'db.open'? Nếu điều đó không trả lời, bạn có thể chỉ muốn hỏi anh ta trực tiếp để làm rõ. –

4

Tôi thích sử dụng async module khi tôi có các bit mã cần chạy đồng bộ.

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') 
    } 
}) 
Các vấn đề liên quan