2011-08-31 20 views
20

Bu kodda bana yardımcı olan var mı? Bir değer bir routeToRoom fonksiyonunu oluşturan dönmek gerekir:bir işlevden sonuç döndürme (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")); 

Ama her zaman olsun: 0

Ben roomId=results.creationix.room önce yürütülür return roomId; sanırım. Birisi bana bu kodla yardım edebilir mi?

cevap

9

an asynchronous function'u eşzamanlı olarak yürütmeye çalışıyorsunuz, bu durum ne yazık ki not possible in Javascript.

Doğru olarak tahmin ettiğiniz gibi, roomId=results ...., DB'den yükleme tamamlanıncaya kadar senkronize olmayan bir şekilde gerçekleştirildiğinde çalıştırılır, böylece kodunuzun geri yüklemesi tamamlanır. Bu makalede de

Bak, bu yaklaşık .insert and not .find bahsediyor, ama fikir aynıdır: http://metaduck.com/01-asynchronous-iteration-patterns.html

+0

Cevabınız için teşekkür ederiz, Andrzej! Http://metaduck.com/post/2675027550/asynchronous-iteration-patterns-in-node-js bağlantısı çalışmıyor, başka bir kaynağınız var mı? Teşekkürler! – profesoralex

+1

Sadece sorunuzu yeniden biçimlendirdim; Simone bu cevabı verdi (sağdaki addan, bu yorumların hemen üstünden anlayabilirsiniz). –

+0

garip, buradan çalışıyor .. Ancak, "nodejs eşzamansız desenler" için google'da arama, bazı makaleler bulacaksınız. –

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

Sen geri aramalar kullanmak gerekir. Asenkronize IO bu şekilde çalışır. Btw sys.puts, cevabınız için teşekkür ederiz,

+2

Mükemmel !! Doğru çalışıyor ve geri aramaları nasıl kullanacağımı öğrendim. – profesoralex

+0

Böyle bir format var mı? Var roomId = takeRoom ("alex", "123") Sorunum, diğer işlevlerde kullanmak için "global" değişkene bir sonuç kaydetmem gerekiyor. Teşekkür ederim! – profesoralex

+1

@profesoralex işinizi yanlış yapıyor. Kodunuzu yeniden yazınız. Düğüm zaman uyumsuzdur. Eşzamansız yazmayı öğrenin. – Raynos

İlgili konular