将已解析的promises数组映射到值数组

时间:2018-06-04 08:31:04

标签: javascript es6-promise

我有一系列已解决的Promises:

[Promise, Promise, Promise, ...]

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

[value_1, value_2, value_3, ...]

这是我到目前为止最接近的地方:

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

更具体地说,我问的原因是因为我有一组Promises数组。

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

我希望将这些映射到一个值集合中的Promise集合批处理为一个对象,然后我将调用另一个将被调用一次的函数 - 在这种情况下React的setState

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

3 个答案:

答案 0 :(得分:4)

  

我有一系列已解决的Promise   ...   如何从mapPromisesToValues

返回这些值

即使你知道承诺已经解决,你也不能从你的函数中返回它们的值的映射。获取promise的值的唯一方法是通过then回调,并且保证回调被异步调用,这意味着你的函数不能返回值;它只能返回值的承诺(例如,如Promise.all那样)。

你必须让你的函数返回Promise.all并让函数的使用者使用它。

重新编辑:

  

更具体地说,我问的原因是因为我有一系列Promises数组。

const collection_1 = [Promise, Promise, Promise, ...];
const collection_2 = [Promise, 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. 状态更新可能是部分更新,因此...this.state是不必要的额外工作。

  3. 根据您的编码环境,您可能会发现采用async / await很有用(例如,如果您正在进行转换,或者您在Node上执行此操作。可以使用最新的Node.js副本。 async / await允许您根据逻辑流编写代码,而不是其同步流。在async函数中,使用await暂停函数并等待承诺解析。 async函数是返回promise的函数的语法糖,而await是消费承诺的语法糖(例如thencatch)。

    要从同步流转换到逻辑流,您可以将入口点设为async函数,以便处理以下错误:

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

    然后,您的函数可以是async函数:

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

    ...任何其他async函数都可以通过await使用

    let values = await example();
    

答案 1 :(得分:1)

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

const mapPromisesToValues = promises => {
  return Promise.all(promises);
}

mapPromisesToValues(promises).then(values => console.log(values));

答案 2 :(得分:0)

const values = await Promise.all(promiseArr);