Node.js:单个变量,多个承诺
问题描述:
我想创建多个承诺,而且我真的不关心这段代码中的种族,只要所有的回调都完成了。Node.js:单个变量,多个承诺
所以,我有一个变量,它包含所有的数据,让我们说:
export interface IData {
data1: string[],
data2: string[],
data3: string[]
}
这3个是无关的,我有一个数据提取器..说:
function getData(id: string): Promise<IData> {
return new Promise((resolve, reject) => {
var data = new TableFetcher();
data.get(_id)
.then((result : IData) => {
resolve()
})
})
}
现在,我想做成这样的:
function x(): Promise<IData> {
return new Promise((resolve,reject) => {
var data: IData = {
data1: getData('100'),
data2: getData('200'),
data3: getData('300')
}
resolve(data)
})
}
当所有getData承诺已完成。
它不需要链,但所有可以单独运行,但我需要返回一个包含所有异步数据完成后的数组。
我该怎么做?
答
- 避免
Promise
constructor antipattern! - 使用
Promise.all
,使对结果的承诺,从承诺的数组:
function getData(id: string): Promise<string[]> {
return new TableFetcher().get(id);
}
function x(): Promise<IData> {
return Promise.all([
getData('100'),
getData('200'),
getData('300')
]).then(([data1, data2, data3]) => {
return <IData>{data1, data2, data3};
});
}
答
function x(): Promise<IData> {
return new Promise((resolve, reject) => {
Promise.all([getData('100'), getData('200'), getData('300')])
.then(result => {
var data: IData = {
data1: result[0],
data2: result[1],
data3: result[2]
}
resolve(data)
})
.catch(err => {
reject(err)
})
})
}
啊...谢谢你.. – Magician
我看到'promise.all'结构,但我在那里找不到'拒绝'。我如何向x()的调用者发送'reject'? – Magician
@Magician如果传递给Promise.all()的任何承诺被拒绝,那么产生的承诺也将被拒绝。 – Thomas