Node.js:单变量,多个承诺

时间:2017-10-28 08:09:57

标签: javascript node.js promise

我想创建多个promises,并且我真的不关心此代码中的种族,只要所有回调都已完成。

所以,我有一个变量,它包含所有数据,让我们说:

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 promises都已完成时。

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

我该怎么做?

2 个答案:

答案 0 :(得分:5)

  1. 避免使用Promise constructor antipattern
  2. 使用Promise.all对承诺数组中的结果做出承诺:
  3. 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};
        });
    }
    

答案 1 :(得分:-1)

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

    })
}