代码之家  ›  专栏  ›  技术社区  ›  jchi2241

将已解析承诺数组映射到值数组

  •  4
  • jchi2241  · 技术社区  · 6 年前

    我有一系列坚定的承诺:

    [Promise, Promise, Promise, ...]
    

    每个承诺在解决后都会返回一个值。如何创建一个函数,将这个承诺数组的映射返回到每个承诺解析的值?

    [value_1, value_2, value_3, ...]
    

    这是我迄今为止最接近的一次:

    const mapPromisesToValues = promises => {
        Promise.all(promises, values => {
            // how do I return these values from mapPromisesToValues
            return values
        });
    }
    

    更具体地说,我问这个问题的原因是因为我有一系列承诺。

    const collection_1 = [Promise, Promise, Promise, ...];
    const collection_2 = [Promise, Promise, Promise, ...];
    //...
    

    我想把这些承诺的集合映射成一个值的集合,然后将其传递到另一个函数中,该函数将被调用一次——在本例中是React的 setState :

    this.setState({
        ...this.state,
        values_1,
        values_2,
        //...
    });
    
    3 回复  |  直到 6 年前
        1
  •  6
  •   T.J. Crowder    6 年前

    我有一系列坚定的承诺 ... 如何从mapPromisesToValues返回这些值

    即使你知道承诺已经解决了,你也不能 回来 函数中的值的映射。获得承诺价值的唯一途径是通过 then 回调,并且该回调保证异步调用,这意味着您的函数不能返回值;它只能返回对价值的承诺(例如 Promise.all 是的)。

    你只需要让你的函数返回 许诺全部的 并让功能的消费者使用它。


    重新编辑:

    更具体地说,我问这个问题的原因是因为我有一系列承诺。

    const collection_1 = [Promise, Promise, Promise, ...];
    const collection_2 = [Promise, Promise, Promise, ...];
    

    //...

    我想把这些承诺的集合映射成一个值的集合,然后将其传递到另一个函数中,该函数将被调用一次——在本例中是React的 setState :

    this.setState({
        ...this.state,
        values_1,
        values_2,
        //...
    });
    

    没关系,你不需要这么做 同步地 .简单地说:

    Promise.all([
        Promise.all(collection_1),
        Promise.all(collection_2),
        // etc.
    ])
    .then(([values_1, values_2, /*etc*/]) => {
        this.setState({values_1, values_2,/*etc*/});
    });
    

    注意,我停了下来 ...this.state 那里两个原因:

    1. 如果基于现有状态设置状态,则 must use the callback version of setState ,而不是接受物品的人;和

    2. 状态更新可能是部分的,所以 ...这状态 这是不必要的额外工作。


    根据您的编码环境,您可能会发现采用 async / await (例如,如果您正在传输,或者您正在Node.js上执行此操作,则可以使用Node.js的最新副本)。 异步的 / 等候 允许您根据其属性编写代码 逻辑流 ,而不是它的同步流。在一分钟内 异步的 功能,你用 等候 暂停功能并等待承诺解决。 异步的 函数是返回承诺的函数的语法糖 等候 是消费承诺的语法糖(例如。, 然后 catch ).

    要实现从同步流到逻辑流的转换,需要将入口点设置为 异步的 处理以下错误的函数:

    (async () => {
        // Your logical flow code here
    }).catch(error => {
        // Handle the error
    });
    

    然后,你的函数可以是 异步的 功能:

    async function example() {
        // ...
        return await Promise.all(thePromises)
    }
    

    ...还有其他的吗 异步的 函数可以通过 等候 :

    let values = await example();
    
        2
  •  1
  •   Tholle    6 年前

    遗憾的是,由于承诺的性质,你无法同步地从承诺中获得价值。你必须这样做:

    const mapPromisesToValues = promises => {
      return Promise.all(promises);
    }
    
    mapPromisesToValues(promises).then(values => console.log(values));
    
        3
  •  0
  •   Ronn Wilder    6 年前
    const values = await Promise.all(promiseArr);