2011-08-31 39 views
20

Có ai có thể giúp tôi với mã này không? Tôi cần phải trả lại một giá trị tạo thành một chức năng routeToRoom:trả lại kết quả từ một hàm (javascript, nodejs)

var sys = require('sys'); 

    function routeToRoom(userId, passw) { 
     var roomId = 0; 
     var nStore = require('nstore/lib/nstore').extend(require('nstore/lib/nstore/query')()); 
     var users = nStore.new('data/users.db', function() { 

      users.find({ 
       user: userId, 
       pass: passw 
      }, (function (err, results) { 
       if (err) { 
        roomId = -1; 
       } else { 
        roomId = results.creationix.room; 
       } 
      })); 
     }); 
     return roomId; 
    } 
    sys.puts(routeToRoom("alex", "123")); 

Nhưng tôi nhận được luôn: 0

Tôi đoán return roomId; được thực hiện trước roomId=results.creationix.room. Ai đó có thể giúp tôi với mã này?

Trả lời

9

Bạn đang cố thực hiện an asynchronous function theo cách đồng bộ, thật không may là not possible in Javascript.

Khi bạn đoán chính xác, roomId=results .... được thực hiện khi tải từ DB hoàn tất, được thực hiện không đồng bộ, vì vậy SAU KHI hoàn tác mã của bạn đã hoàn tất.

Nhìn vào bài viết này, nó nói về .insert and not .find, nhưng ý tưởng là như nhau: http://metaduck.com/01-asynchronous-iteration-patterns.html

+0

cảm ơn bạn đã trả lời, Andrzej! Liên kết http://metaduck.com/post/2675027550/asynchronous-iteration-patterns-in-node-js không hoạt động, bạn có nguồn khác không? Cảm ơn! – profesoralex

+1

Tôi vừa định dạng lại câu hỏi của bạn; Simone cung cấp câu trả lời này (bạn có thể nói từ tên bên phải, ngay trên những bình luận này). –

+0

lạ, nó hoạt động ở đây .. tuy nhiên, tìm kiếm trên google cho "các mẫu không đồng bộ nodejs", bạn sẽ tìm thấy một số bài viết. –

38
function routeToRoom(userId, passw, cb) { 
    var roomId = 0; 
    var nStore = require('nstore/lib/nstore').extend(require('nstore/lib/nstore/query')()); 
    var users = nStore.new('data/users.db', function() { 
     users.find({ 
      user: userId, 
      pass: passw 
     }, function(err, results) { 
      if (err) { 
       roomId = -1; 
      } else { 
       roomId = results.creationix.room; 
      } 
      cb(roomId); 
     }); 
    }); 
} 
routeToRoom("alex", "123", function(id) { 
    console.log(id);  
}); 

Bạn cần phải sử dụng callbacks. Đó là cách IO không đồng bộ hoạt động. Btw sys.puts không được dùng nữa

+2

Excelent !!!! Nó hoạt động chính xác và tôi đã học cách sử dụng callbacks. – profesoralex

+0

Có tồn tại một định dạng như thế không? Var roomId = takeRoom ("alex", "123"); Vấn đề của tôi là tôi cần lưu một kết quả vào biến "toàn cầu" để sử dụng nó trong các hàm khác. Cảm ơn bạn! – profesoralex

+1

@profesoralex bạn làm sai. Viết lại mã của bạn. Nút là không đồng bộ. Tìm hiểu để viết không đồng bộ. – Raynos

Các vấn đề liên quan