यह संदेह वादों को लेकर है। मुझे ब्लॉक के बाहर शुरू किए गए सरणी में उप-संग्रह 'बार' के दस्तावेज़ जोड़ने की आवश्यकता है

...
foo.bars = new Array<IBar>();
let manyBars = documentRef.collection('bar').listDocuments();
(await manyBars).forEach( barItem => {
    barItem.get().then(barDocument => {

        let bar: IBar = JSON.parse(JSON.stringify(barDocument.data()));
        if (foo.bars !== null) {
            foo.bars.push(bar);
            console.log('in');
        }
    });
});

console.log('out');

मेरा कंसोल.लॉग () प्रिंट पहले 'आउट' और फिर 'इन' करता है। मैं क्या गलत कर रहा हूं? प्रत्येक विधि के लिए "प्रतीक्षा" है।

0
destri 21 मार्च 2020, 22:04

1 उत्तर

सबसे बढ़िया उत्तर

आप जो गलत कर रहे हैं, वह मुख्य रूप से, एसिंक्रोनस .then() कॉलबैक को लाइन-ऑर्डर में पूरा करने की अपेक्षा करता है, अगर यह सिंक्रोनस होता। यह महसूस करना महत्वपूर्ण है कि .then() कॉलबैक वर्तमान ईवेंट थ्रेड के पूरा होने के बाद निष्पादित किए जाते हैं।

जबकि await, .then() के लिए सिर्फ एक वाक्य-विन्यास विकल्प है, यह काफी हद तक एसिंक्रोनस कोड को उतना ही लिखने की अनुमति देता है जितना कि यह सिंक्रोनस होने पर होता।

सामान्य तौर पर, किसी दिए गए फ़ंक्शन के भीतर, .then() और await सिंटैक्स को न मिलाना अच्छा अभ्यास है

मान लें कि barDocument.data() समकालिक है, यह इस तरह से सरल होना चाहिए ...

...
try{
    let manyBars = await documentRef.collection('bar').listDocuments();
    let barDocuments = await Promise.all(manyBars.map(barItem => barItem.get()));
    let foo.bars = barDocuments.map(barDocument => barDocument.data());
}
catch(error) {
    console.log(error);
    // handle error as necessary.
    // return a value or re-throw the error.
}

अगर barDocument.data() एसिंक्रोनस है, तो आपको एक और await Promise.all(...) पेश करना होगा।

1
Roamer-1888 22 मार्च 2020, 20:57