Promise.all [array] में array.map पुनरावृत्तियों के लिए प्रतीक्षा करें

Dec 06 2020

मेरे पास निम्नलिखित कोड हैं जो ग्राहकों के लिए आइटम जोड़ना चाहिए यदि वे पहले से मौजूद नहीं हैं। निष्पादन समानांतर में होना चाहिए।

await Promise.all(
    customers.map(async (customer) => {
        return customer.items.map(async (item) => {
            return new Promise(async (resolve) => {
                const productExists = someArray.some(
                    (arrayValue) => arrayValue === item.id
                );
                if (!productExists) {
                    logger.info(
                    `customer item ${item.id} does not exist, creating...` ); await createCustomerItem(item.id); logger.info(`customer item ${item.id} created.`);

                    someArray.push(item.id);
                } else {
                    logger.info(`customer item ${item.id} already exists, skipping...`);
                }
                resolve(true);
            });
        });
    })

);

logger.info(`All items should now be present`);

समस्या यह है कि निष्पादन createCustomerItemमामलों के समाधान के लिए इंतजार नहीं कर रहा है!productExists)

यह लॉग है

customer item 32310 does not exist, creating...
customer item ao does not exist, creating...
customer item ute does not exist, creating...
All items should not be present
customer item ao created.
customer item ute created.
customer item 32310 created.

स्वाभाविक रूप से All items should not be presentआखिरी आना चाहिए।

जब सभी आइटम पहले से मौजूद हैं, तो प्रक्रिया अच्छी दिखती है।

जवाब

JulienD Dec 06 2020 at 18:46

इसके साथ प्रयास करें flatMap:

await Promise.all(
    customers.flatMap(async (customer) => {
        return customer.items.map(async (item) => {

वादे की एक सरणी की वापसी के बजाय, यह सामग्री को वादों के एक सरल सरणी में समतल कर देगा, जो कि Promise.allउम्मीद है।

एनबी यह आपके प्रश्न से स्पष्ट नहीं है कि क्या प्रति ग्राहक वस्तुओं के समूहन को संरक्षित करने की आवश्यकता है। यदि ऐसा होता है, तो ध्यान दें कि यह समाधान डेटा संरचना को एक चपटा सूची में बदल देता है, इसलिए आप समूहन खो देते हैं। या तो customerIdअपने items में कुछ जोड़ें , या टिप्पणियों में @ blex के सुझाव का प्रयास करें।

ShashanSooriyahetti Dec 06 2020 at 18:56

आप ऐसा कुछ कर सकते हैं

const fruitsToGet = ['apple', 'grape', 'pear']

const mapLoop = async () => {
  console.log('Start')

  const promises = await fruitsToGet.map(async fruit => {
    const numFruit = new Promise((resolve, reject) => {
      setTimeout(() => resolve(fruit), 1000)
    });
    return numFruit
  })
  const numFruits = await Promise.all(promises)
  console.log(numFruits)

  console.log('End')
}

mapLoop();

परिणाम

Start
["apple", "grape", "pear"]
End

स्रोत डेमो