8

ऑनव्राइट हैंडलर में, मैं एकाधिक पढ़ना चाहता हूं, कुछ डेटा कुशलतापूर्वक उपयोग करना चाहता हूं, और फिर इसे संग्रहीत करना चाहता हूं। मैं वादा अवधारणा के लिए बिल्कुल नया हूँ। क्या मैं निम्नलिखित वादा प्रबंधन से सुरक्षित हूं, फायरबेस के संबंध में मेरे प्रश्नों को पूरा करने से पहले नहीं?फायरबेस के लिए क्लाउड फ़ंक्शंस: धारावाहिक क्रमबद्ध

exports.test = functions.database.ref('/zzz/{uid}').onWrite(event => { 
    console.log('zzz', event.data.val()); 

    return Promise.all([ 
     admin.database().ref('/zzz/1').once('value'), 
     admin.database().ref('/zzz/2').once('value') 
    ]).then(function(snaps) { 
     console.log('loaded', snaps[0].val()); 
     var updKeys = { 
      ["/xxx/" +event.params.uid +"/zoo"]: 'giraffe', 
     } 

     admin.database().ref().update(updKeys, function(error) { 
      console.log("Updating data finished. ", error || "Success."); 
     }) 
    }); 

}); 

ऊपर काम करता है, लेकिन नहीं जानते कि इसके सही तरीके से ...

+0

मुझे उत्सुकता है कि आप 'स्नैप [1] '... का उपयोग कभी नहीं करते हैं, तो आप'/zzz/2' का अनुरोध क्यों कर रहे हैं? –

+0

यह सिर्फ एक परीक्षण है - पुनर्प्राप्त डेटा के वास्तविक (गलत) उपयोग को ध्यान में रखें (या बदसूरत तथ्य यह हार्डकोडेड यूड्स का उपयोग कर रहा है :) – jazzgil

+0

यह भी ध्यान दें कि आप अपने 'ऑन्राइट' कॉलबैक से वापस आने वाले वादे को हल कर चुके हैं ** ** से पहले अंत में 'अपडेट' पूरा हो गया है। यदि यह जानबूझकर नहीं है, तो आपको एक वादा करना होगा, इसे 'फिर' से वापस कर देना होगा, और इसे 'अपडेट' कॉलबैक में हल करना होगा। –

उत्तर

7

अपने समारोह के बाद यह वापस आ गया है (या वादा है कि अपने कार्य रिटर्न का समाधान हो गया), Google मेघ कार्य निष्पादित करने के लिए जारी है किसी भी समय अपने कोड को बाधित कर सकता है। हालांकि इस बात की कोई गारंटी नहीं है कि तुरंत ऐसा करेगा।

अपने कोड नमूने में, आप अंतिम then() का परिणाम वापस कर देते हैं। चूंकि आप then() ब्लॉक के भीतर से कुछ भी वापस नहीं लौटते हैं, इसलिए जीसीएफ update()या पर कॉल को बाधित कर सकता है, यह आवश्यकतानुसार कोड को लंबे समय तक चलने दे सकता है।

इसे ठीक करने के, सुनिश्चित करें कि करने के लिए "ऊपर बुलबुले" update() कॉल से वादा:

exports.test = functions.database.ref('/zzz/{uid}').onWrite(event => { 
    console.log('zzz', event.data.val()); 

    return Promise.all([ 
     admin.database().ref('/zzz/1').once('value'), 
     admin.database().ref('/zzz/2').once('value') 
    ]).then(function(snaps) { 
     console.log('loaded', snaps[0].val()); 
     var updKeys = { 
      ["/xxx/" +event.params.uid +"/zoo"]: 'giraffe', 
     } 

     return admin.database().ref().update(updKeys, function(error) { 
      console.log("Updating data finished. ", error || "Success."); 
     }) 
    }); 

}); 

इस कोड में, वादा update() द्वारा दिया एक जीसीएफ को लौट जा रही है, जो यह देता है जब तक इसकी आवश्यकता हो, ठीक उसी समय आपके फ़ंक्शन को चलाने के लिए जानकारी दें।

+0

आह! एक वापसी याद आ गई। धन्यवाद! :) इसके अलावा, यह सोच रहा था कि कौन सा टैग फायरबेस-फ़ंक्शंस के साथ जाता है, धन्यवाद। – jazzgil

+0

हाँ, नामकरण भ्रमित है। उसके लिए माफ़ करना। यहां मेरी व्याख्या भी देखें: http://stackoverflow.com/questions/42854865/what-is-the-difference-between-cloud-function-and-firebase-functions/42859932#42859932 –

+0

मैं 'event.data का उपयोग कर रहा था। adminRef.root.child ('/ x') ', लेकिन क्या' admin.database()। ref ('/ x') 'का उपयोग करना संभव है? – JCarlos

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