2011-08-31 10 views
20

क्या कोई इस कोड के साथ मेरी सहायता कर सकता है? मैं वापस जाने के लिए एक मूल्य एक routeToRoom समारोह के रूप में की जरूरत है:फ़ंक्शन से परिणाम (जावास्क्रिप्ट, नोडजेज़)

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

आप an asynchronous function को एक तुल्यकालिक तरीके से निष्पादित करने का प्रयास कर रहे हैं, जो दुर्भाग्य से not possible in Javascript है।

जैसा कि आपने सही ढंग से अनुमान लगाया है, roomId=results .... डीबी पूर्ण होने पर लोड होने पर निष्पादित किया जाता है, जो आपके कोड को फिर से पूरा कर लेता है। इस लेख पर

देखो, यह .insert and not .find बारे में बात करती है, लेकिन विचार एक ही है: http://metaduck.com/01-asynchronous-iteration-patterns.html

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, एंड्रज! लिंक http://metaduck.com/post/2675027550/asynchronous-iteration-patterns-in-node-js काम नहीं कर रहा है, क्या आपका कोई अन्य स्रोत है? धन्यवाद! – profesoralex

+1

मैंने अभी आपके प्रश्न को दोबारा सुधार दिया है; सिमोन ने यह उत्तर दिया (आप इन टिप्पणियों के ठीक ऊपर, दाईं ओर दिए गए नाम से बता सकते हैं)। –

+0

अजीब, यह यहां से काम कर रहा है .. हालांकि, "नोडज एसिंक्रोनस पैटर्न" के लिए 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);  
}); 

आप कॉलबैक का उपयोग करने की जरूरत है। इस तरह एसिंक्रोनस आईओ काम करता है। बीटीडब्ल्यू sys.puts को

+2

एक्सेलेंट !!!! यह सही ढंग से काम करता है और मैंने सीखा है कि कॉलबैक का उपयोग कैसे करें। – profesoralex

+0

क्या ऐसा प्रारूप मौजूद है? Var roomId = takeRoom ("alex", "123"); मेरी समस्या यह है कि मुझे परिणाम को "ग्लोबल" वैरिएबल में अन्य कार्यों में उपयोग करने के लिए सहेजने की ज़रूरत है। धन्यवाद! – profesoralex

+1

@profesoralex आप इसे गलत कर रहे हैं। अपना कोड दोबारा लिखें। नोड असीमित है। असीमित रूप से लिखना सीखें। – Raynos

संबंधित मुद्दे