2011-08-31 17 views
20

誰でもこのコードを教えてもらえますか?私は値を返す必要がrouteToRoom機能形成:関数の結果を返す(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")); 

をしかし、私は常に取得する:0

私はreturn roomId;roomId=results.creationix.room前に実行されると思います。誰かがこのコードを教えてくれますか?

答えて

9

あなたは、残念ながらnot possible in Javascriptで、同期方法、でan asynchronous functionを実行しようとしています。

あなたが正しく推測したように、roomId=results ....は、DBからのロードが完了したときに実行されます。これは非同期で実行されるため、コードの残りが完了した後に実行されます。この記事では

見て、それはおよそ.insert and not .findを話しますが、考え方は同じです:http://metaduck.com/01-asynchronous-iteration-patterns.html

+0

あなたのお返事ありがとうございました、Andrzej! http://metaduck.com/post/2675027550/asynchronous-iteration-patterns-in-node-jsのリンクは機能していません。別のソースをお持ちですか?ありがとう! – profesoralex

+1

私はちょうどあなたの質問を再フォーマットしました。 Simoneはこの答えを出しました(これらのコメントのすぐ上の、右の名前から分かります)。 –

+0

奇妙な、ここから..しかし、 "nodejs非同期パターン"のGoogleで検索すると、いくつかの記事を見つけるでしょう。 –

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

あなたはコールバックを使用する必要があります。これが非同期IOが動作する仕組みです。 Btw sys.putsは非推奨です

+2

Excelent !!!!それは正しく動作し、私はコールバックを使用する方法を学びました。 – profesoralex

+0

はないというような形式に存在するVAR roomId = takeRoom(「アレックス」、「123」);?私の問題は、私は他の関数で使用する「グローバル」変数に結果を保存する必要があります。ありがとうございました! – profesoralex

+1

@profesoralexあなたが間違っている。コードを書き直してください。ノードは非同期です。非同期で書くことを学ぶ。 – Raynos

関連する問題