2012-03-10 18 views
7

से नोडजेएस रिटर्न वैल्यू मैं एक ऐसे एप्लिकेशन का निर्माण कर रहा हूं जिसमें किसी विशेष कॉल पर, मुझे ब्लॉक करना होगा और परिणाम से पहले प्रमाणीकरण क्वेरी से परिणामों की प्रतीक्षा करनी होगी।कॉलबैक

function authenticate(userid, hash) 
{ 
    mysql_client.query("SELECT `hash` FROM `auth` WHERE `userid` = " + userid, function selectCb(err, results, fields) { 
    if (err) 
    { 
     client.send("Error communicating with mysql, please retry your request"); 
     return false; 
    } 

    if(results.length == 0 || results[0].hash != hash) 
    { 
     client.send("Error comparing authentication data with database, please retry request"); 
     return false; 
    } 

    return true; 
} 
); 
} 

मैं प्रमाणित() फ़ंक्शन ही है, नहीं आंतरिक गुमनाम समारोह selectCb से उन मूल्यों को वापस जाने के लिए सक्षम होना चाहते हैं और ब्लॉक को प्रमाणित जब तक कॉलबैक पूरा हो गया है है। मैं ऐसा कैसे कर सकता हूं?

उत्तर

13

आपके बाहरी फ़ंक्शन को कॉलबैक स्वयं प्रदान करने की आवश्यकता है जिसे MySQL कॉल करने के बाद निष्पादित किया जा सकता है। इस की तर्ज पर कुछ:

function authenticate(user, pass, callback) { 
    mysql_client.query("...", function (err, results, fields) { 
     if (err) { 
      callback("Error communicating ..."); 
     } else if (results.length ...) { 
      callback("Error comparing authentication..."); 
     } 
     callback() 
    }); 
}); 

उदाहरण उपयोग:

authenticate('jim', '123456', function (err) { 
    if (err) { 
     alert(err); 
    } else { 
     alert('Welcome'); 
    } 
}); 
+0

धन्यवाद, यह एक दिलचस्प समाधान प्रतीत होता है, लेकिन मैं अभी भी एक सा अनिश्चित कैसे इस से बाहर एक मूल्य प्राप्त करने के लिए कर रहा हूँ। मान लें कि मैं इस बिंदु पर रुकने का अनुरोध चाहता हूं कि प्रमाणीकरण विफल रहता है, अन्यथा आवेदन के साथ जारी रखें। ऐसा लगता है कि मैं उस कॉलबैक में जो कुछ भी लौटाता हूं उसे कॉलबैक रिटर्न वैल्यू के रूप में भी खाया जाएगा, इसलिए मैं इसे भी सच/गलत नहीं कर सका। मुझसे यह कैसे होगा? –

+0

@majicbunnie यदि आपके आवेदन प्रवाह का एक हिस्सा असीमित है, जो पूरे बहुत अतुल्यकालिक बनाता है और आपको इस तरह से कॉलबैक की आवश्यकता होती है। इसे सरल बनाने और अपने कोड को काम करने में आसान बनाने के लिए, आपको "वायदा" या "वादे" नामक एक अवधारणा को देखना चाहिए। यह आपको पागलपन से घुटने वाली कॉलबैक बनाने से बचाता है। यदि आप इसकी खोज करते हैं तो आसपास बहुत सारी जानकारी है, लेकिन आप यहां शुरू कर सकते हैं: http://howtonode.org/promises – nickf

+0

ओपी के साथ ही। वादे या इस तरह के प्रयोग किए बिना, कोई सरल प्रोग्राम का उपयोग करके प्रमाणीकृत() फ़ंक्शन से उन मानों को वापस कैसे कर सकता है? मैं समाधान को समझ सकता था, लेकिन मुझे उदाहरण के उपयोग से भ्रमित हो गया। ऐसा लगता है कि यह ओपी के सवाल का जवाब नहीं देता है। – jagc