我有一系列已解决的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,
//...
});
答案 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
处停了下来。有两个原因:
如果您根据现有状态设置状态,则为must use the callback version of setState
,而不是接受对象的状态;以及
状态更新可能是部分更新,因此...this.state
是不必要的额外工作。
根据您的编码环境,您可能会发现采用async
/ await
很有用(例如,如果您正在进行转换,或者您在Node上执行此操作。可以使用最新的Node.js副本。 async
/ await
允许您根据逻辑流编写代码,而不是其同步流。在async
函数中,使用await
暂停函数并等待承诺解析。 async
函数是返回promise的函数的语法糖,而await
是消费承诺的语法糖(例如then
和catch
)。
要从同步流转换到逻辑流,您可以将入口点设为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);