मेरे पास एक वस्तु है जिसके मूल्यों के रूप में वादे हैं। ऑब्जेक्ट फ़ील्ड में विभिन्न प्रकार के मान हो सकते हैं जैसे फ़ंक्शन, वादे, तार, संख्याएं, या कोई अन्य ऑब्जेक्ट। मैं एक फ़ंक्शन को कैसे कार्यान्वित करूं जो ऑब्जेक्ट में सभी वादों को हल करने की प्रतीक्षा करता है?

const asyncFunction = () => {
  return Promise.resolve("Resolved!")
}
const nonAsyncFunction = () => {
  return "Resolved!"
}
const awaitObjectWithPromise = (obj) => {
  // Returns a promise which waits for all
  // the promises inside "obj" to be resolved.
}
let obj = {
  key1: asyncFunction(),
  key2: nonAsyncFunction(),
  key3: "Some Value",
  parent1: {
    key1: asyncFunction(),
    key2: nonAsyncFunction(),
    key3: "Some Value"
  }
}

awaitObjectWithPromise(obj).then((obj) => {
  console.log(obj);
  // Should output:
  // {
  //     key1: "Resolved!",
  //     key2: "Resolved!",
  //     key3: "Some Value",
  //     parent1: {
  //         key1: "Resolved!",
  //         key2: "Resolved!",
  //         key3: "Some Value"
  //     }
  // }
})
3
Ramil Amparo 7 नवम्बर 2018, 15:15

2 जवाब

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

आप वस्तु की चाबियों के माध्यम से पुनरावृति कर सकते हैं और वादों को हल कर सकते हैं।

const asyncFunction = () => {
  return Promise.resolve("Resolved!")
}
const nonAsyncFunction = () => {
  return "Resolved!"
}
const awaitObjectWithPromise = async(obj) => {
  for (let prop in obj) {
    // If the propriety has a 'then' function it's a Promise
    if (typeof obj[prop].then === 'function') {
      obj[prop] = await obj[prop];
    }
    if (typeof obj[prop] === 'object') {
      obj[prop] = await awaitObjectWithPromise(obj[prop]);
    }
  }
  return obj;
}

let obj = {
  key1: asyncFunction(),
  key2: nonAsyncFunction(),
  key3: "Some Value",
  parent1: {
    key1: asyncFunction(),
    key2: nonAsyncFunction(),
    key3: "Some Value"
  }
}

awaitObjectWithPromise(obj).then((obj) => {
  console.log(obj);
});
3
André Adriano 7 नवम्बर 2018, 13:03

स्वीकृत उत्तर में, मैं कुछ चीजों से खुश नहीं था:

  • यदि कोई एक फ़ील्ड null या undefined है, तो एक त्रुटि उत्पन्न होती है;
  • इनपुट मूल्य एक वादा नहीं हो सकता;
  • वादों की प्रतीक्षा में समानता की कमी;

इन चीजों को ठीक करने के लिए, मैंने फ़ंक्शन को बदल दिया:

const promiseAll = async (obj) => {
    if (obj && typeof obj.then == 'function') obj = await obj;
    if (!obj || typeof obj != 'object') return obj;
    const forWaiting = [];
    Object.keys(obj).forEach(k => {
        if (obj[k] && typeof obj[k].then == 'function') forWaiting.push(obj[k].then(res => obj[k] = res));
        if (obj[k] && typeof obj[k] == 'object') forWaiting.push(promiseAll(obj[k]))
    });
    await Promise.all(forWaiting);
    return obj;
}

शायद किसी के लिए यह उपयोगी होगा।

2
Alex 13 जिंदा 2021, 10:42