Ожидание обещаний внутри объекта для разрешения - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть объект, который имеет обещания в качестве своих значений. Поля объекта могут иметь различные типы значений, такие как функции, обещания, строки, числа или другой объект. Как реализовать функцию, которая ожидает разрешения всех обещаний в объекте?

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"
  //     }
  // }
})

1 Ответ

0 голосов
/ 07 ноября 2018

Вы можете перебирать ключи объекта и решать обещания.

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);
});
...