Установите аргументы динамически с Promise.all (). Then () - PullRequest
0 голосов
/ 28 января 2020

Код ниже работает для меня

Promise.all([first, second, third]).then([first, second, third] => {
  console.log(second);
});

Я знаю, что console.log(second) даст мне значение с ключом second.

Мои обещания установлены динамически, и теперь они выглядят так:

let collection = [second, third];

Promise.all(collection).then((collection) => {
  console.log(collection);
});
  • В этом примере я установил два значения в коллекции. В реальной жизни он может содержать более или менее значения.
  • Когда я использую console.log(collection), он выдаст collection[0] и collection[1]. В этом случае я не знаю, каково значение collection[1].

Вопрос

Как я, как и мой первый пример, могу иметь что-то вроде динамически именованных аргументов типа collection['second'] или подобное?

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Поскольку мы хотим получить динамический доступ к значению, сначала установите collection на пустой объект. Затем используйте keys из collection, чтобы передать все его значения Promise в Promise.all. Затем отобразите обратно выполненные значения, а затем мы можем получить доступ к значению collection по некоторому ключу.

let collection = {}

for (let i = 0; i < 3; i++) {
  collection[`key${i}`] = Promise.resolve(i)
}

let collectionKeys = Object.keys(collection)
Promise.all(collectionKeys.map(key => collection[key]))
  .then(values => {
    let collectionFulfilled = collectionKeys.reduce((obj, key, i) => {
      obj[key] = values[i]
      return obj
    }, {})
    console.log(collectionFulfilled)
  })
1 голос
/ 28 января 2020

Если вы передадите свои обещания, внедренные в объект с помощью единственного ключа, вы можете использовать это для его имени, а затем с помощью простой вспомогательной функции отменить значения и ключи из этого.

С новым ES6 затем вы можете просто передать как -> [{one}, {two}, {three}] et c.

Ниже приведен пример с вспомогательной функцией под названием namedPromiseAll.

function namedPromiseAll(named) {
  const pcollection =
    named.map(m => Object.values(m)[0]);
  const ncollection =
    named.map(m => Object.keys(m)[0]);
  return Promise.all(pcollection).then((c) => {
    return c.reduce((a,v,ix) => {
      a[ncollection[ix]] = v;
      return a;
    }, {});
  });
}


const second = Promise.resolve(2);
const third = Promise.resolve(3);

const collection = [{second}, {third}];

namedPromiseAll(collection).then(console.log);
...