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承诺已完成。

它不需要链,但所有可以单独运行,但我需要返回一个包含所有异步数据完成后的数组。

我该怎么做?

  1. 避免Promise constructor antipattern
  2. 使用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}; 
    }); 
} 
+0

啊...谢谢你.. – Magician

+0

我看到'promise.all'结构,但我在那里找不到'拒绝'。我如何向x()的调用者发送'reject'? – Magician

+1

@Magician如果传递给Promise.all()的任何承诺被拒绝,那么产生的承诺也将被拒绝。 – Thomas

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) 
 
      }) 
 

 
    }) 
 
}