【问题标题】:Set arguments dynamically with Promise.all().then()使用 Promise.all().then() 动态设置参数
【发布时间】:2020-05-13 23:21:15
【问题描述】:

下面的代码适合我

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'] 或类似名称的动态参数?

【问题讨论】:

  • 我的收藏总是包含一个标识符,因为我希望收藏是可移植的。所以他们不应该依赖获取集合的请求或响应对象来知道它们是什么。由于承诺保留了它们的顺序,最坏的情况是,您可以保留 let collection 内部内容的列表,并在 .all() 解析后将名称映射回响应。

标签: javascript dynamic parameters promise arguments


【解决方案1】:

由于我们要动态访问值,所以首先将collection 设置为一个空对象。然后,使用来自collectionkeys 将其所有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)
  })

【讨论】:

  • 是的,效果很好!您不喜欢将; 放在行尾吗? ;)
  • @JensTörnell stackoverflow.com/questions/2846283/… 个人我喜欢放 ; ,但有些人喜欢 ASI。
  • @JensTörnell 我曾经使用;。因为我学习了 Kotlin(不允许使用分号),所以我决定它只是 看起来更好(如果这有意义的话?)没有分号,所以是的,没有分号 xD
  • @Keith 我明白了。我刚刚注意到我的 Vscode 会自动添加 ; 如果它们丢失了。我猜是 PrettierNow 扩展做到了。
【解决方案2】:

如果您使用单个键传递嵌入在对象中的 Promise,则可以将其用作其名称,然后使用简单的辅助函数将值和键从中反转。

使用新的 ES6,您可以像 -> [{one}, {two}, {three}] 等一样传递。

下面是一个名为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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多