2014-10-10 10 views
5

पर पैरेंट वैरिएबल में पासिंग चर यह फ़ायरबेस प्रश्न से अधिक जावास्क्रिप्ट क्लोजर प्रश्न है। निम्न कोड में, फ़ायरबेस कॉलबैक वैरिएबल myArr को मूल दायरे में पहचान नहीं रहा है।कॉलबैक फ़ंक्शन

function show_fb() { 
    var myArr = []; 
    var firebase = new Firebase('https://scorching-fire-6816.firebaseio.com/'); 
    firebase.on('child_added', function(snapshot) { 
     var newPost = snapshot.val(); 
     myArr.push(newPost.user); 
     console.log(myArr); // works 
    }); 
    console.log(myArr); // doesn't work. myArr in the firebase.on callback is 
         // not altering myArr 
    return myArr; 
}; 

उत्तर

9

कॉलबैक को पहचानना है/को संशोधित करने के लिए डालते हैंपूरी तरह से ठीक है। समस्या यह है कि जब आपका "काम नहीं करता" - लेबल console.log(myArr) निष्पादित करता है, तो कॉलबैक अभी तक नहीं निकाल दिया गया है।

के अपने कोड थोड़ा बदल डालते हैं:

var myArr = []; 
function show_fb() { 
    var firebase = new Firebase('https://scorching-fire-6816.firebaseio.com/'); 
    firebase.on('child_added', on_post_added); // steps 1-3 
    console.log(myArr);      // step 4 
    return myArr;        // step 5 
}; 
function on_post_added(snapshot) {    // step 6 
    var newPost = snapshot.val(); 
    myArr.push(newPost.user);     // step 7 
    console.log(myArr);      // step 8 
} 

अब यह देखने के लिए क्या हो रहा है थोड़ा आसान हो सकता है।

  1. आप child_added के लिए एक श्रोता है कि आपके Firebase में जोड़ा जाता है प्रत्येक पोस्ट के लिए on_post_added कॉल करेंगे रजिस्टर
  2. इस सर्वर के लिए एक कॉल है, जो समय की एक महत्वपूर्ण राशि का समय लग सकता
  3. वापस जाने के लिए में परिणाम होगा
  4. इस बीच आपका जावास्क्रिप्ट कोड जारी है और ...
  5. सरणी है, जो इस स्तर पर अभी भी
  6. खाली है लॉग और तब इस प्रकार कुछ बिंदु सर्वर नया मान (रों) रिटर्न पर अब एक खाली सरणी
  7. वापस लौटकर आपके कॉलबैक शुरू हो जाती है
  8. जिसका मतलब है हम समस्याओं
  9. बिना सरणी में जोड़ सकते हैं और यह कंसोल के लिए प्रवेश करने की उम्मीद मूल्यों

एसिंक्रोनस कोड हैंडलिंग से पता चलता/इस तरह कॉलबैक कुछ करने के लिए इस्तेमाल हो रही लेता है, लेकिन Firebase या किसी के साथ काम करने के लिए महत्वपूर्ण हैअन्य AJAX- या घटना संचालित प्रौद्योगिकी। कॉलबैक के कोड को एक अलग फ़ंक्शन में डालकर कभी-कभी यह देखने में थोड़ा आसान होता है कि क्या हो रहा है।

फ़ायरबेस के मामले में यह भी एहसास करने में मदद कर सकता है कि इस घटना को child_added कहा जाता है। जब भी आप पहली बार अपना कॉलबैक पंजीकृत करते हैं, तब भी जब भी कोई बच्चा फायरबेस में जोड़ा जाता है, उसे बुलाया जाता है। तो कुछ मिनट बाद जब कोई अन्य ग्राहक एक बच्चा जोड़ता है, तो आपका कॉलबैक अभी भी आग लग जाएगा, myArr पर नया बच्चा जोड़ देगा। उस चरण में उपरोक्त चरण 4 और 5 में कोड लंबे समय तक निष्पादित हो जाएगा और फिर से निष्पादित नहीं होगा।

समाधान सरल है:

var myArr = []; 
function show_fb() { 
    var firebase = new Firebase('https://scorching-fire-6816.firebaseio.com/'); 
    firebase.on('child_added', on_post_added); 
}; 
function on_post_added(snapshot) { 
    var newPost = snapshot.val(); 
    myArr.push(newPost.user); 
    console.log(myArr); 
    // do whatever else you need to do for a new post 
} 
+0

स्पष्ट उत्तर के लिए धन्यवाद: कुछ भी है कि आप के बाद एक बच्चे को अपने कॉलबैक में जोड़ा जाता है क्या करना चाहते हैं डाला! अपने उत्तर की तरह सबसे अच्छा लेकिन बैज पॉइंट्स (संकेत) की कमी के लिए इसे वोट करने में असमर्थ हूं। –

+0

यह देखते हुए कि आपने सवाल पूछा है, आप इसके बाईं ओर चेक मार्क पर क्लिक करके ** ** मेरे उत्तर को स्वीकार करने में सक्षम होना चाहिए। Http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

+0

उत्तर फ्रैंक के लिए धन्यवाद - यह सिर्फ उस गेम पर मेरी मदद करता है जिसे मैं बना रहा हूं। – Nadjib

1

child_added घटना तुरंत निष्पादित नहीं होता, इसलिए तुल्यकालिक नहीं है और आप भरोसा नहीं कर सकते पर यह अपने समारोह के अंत में लॉग कॉल करने से पहले, निष्पादित करने के लिए।

प्रक्रिया है:

  • myArr
  • का दृष्टांत Firebase myArr
  • का मूल्य
  • वापसी myArr परिभाषित
  • child_added
  • के लिए असाइन ईवेंट हैंडलर लॉग इन करें - समारोह के अंत
  • अब इसके बाद कुछ बिंदु पर, child_added ईवेंट निकाल दिया जाता है, जो आपके सरणी पर धक्का देता है, लेकिन जैसा कि आप देख सकते हैं, आपका show_fb() मजेदार इस बिंदु से ction पहले ही निष्पादित कर चुका है।
0

अगर फ़ायरबेस एजेक्स कॉल (शायद यह करता है) बनाता है, तो कॉलबैक फ़ंक्शन (स्नैपशॉट) {..} को वापसी कथन के बाद बुलाया जाता है। तो समारोह show_fb हमेशा रिटर्न []।

  • आप इस बयान पर अमल:

    उदाहरण के लिए

    वर एक्स = show_fb();

    • show_fb खाली सरणी
    • समारोह ajax कॉल बनाता है बनाता है
    • फ़ंक्शन myArr (यह इस समय खाली है)
    • चर x (सरणी अभी भी खाली है)
    • कॉलबैक कहा जाता है myArr के संदर्भ में हो जाता है और एक्स के लिए नए मूल्य (एक्स और myArr एक ही उदाहरण है)
संबंधित मुद्दे