从多个Promise <u>创建一个Promise <map <t,u >>

时间:2019-01-02 10:59:01

标签: typescript promise

我正在尝试使用打字稿来获取许多客户的账单:

我有一个Server类,处理对服务器的查询,并提供一个getBills类,该类返回一个Promise<Bill[]>

class Server {
    constructor(hostname?: string) {
        hostname = hostname || "";

    }

    getBills(customer: Customer): Promise<Datapoint[]> {
        const apiEndPoint = new URL("/API/Bills");
        let parameters = { customer: customer.name};

        //Fetch official doc
        //https://github.com/whatwg/fetch/issues/56
        Object.keys(parameters).forEach(key => apiEndPoint.searchParams.append(key, parameters[key]));

        return fetch(apiEndPoint.toString())
            .then(response => {
                if (!response.ok) {
                    throw new Error(response.statusText)
                } 
                return response.json()
            })
    }    
}

我想查询几个客户的账单,并返回一个Map进行进一步处理(并使它们保持异步状态,Promise<Map<Customer, Bill[]>>,但是我在这一步上很挣扎。

到目前为止我所拥有的:

getBills(): Promise<Map<Customer, Bill[]>> {
        let server = this.context.server;
        let resultMap = new Map<Customer, Bill[]>();

        let promises = [];

        for (let customer of this.customers) {
            promises.push(
                server.getBills(customer).then(result => resultMap.set(customer, result))
            );
        }
        Promise.all(promises).then(return resultMap);
    }

但是它不能编译,因为它试图返回地图本身,而不是Promise。

我尝试使用

 Promise.all(promises).then(return Promise.resolve(resultMap));

但也不起作用。

你能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

写这是语法错误:

.then(return resultMap);

then方法必须接收一个函数作为参数,而return只是一个语句,而不是一个函数。因此更改为:

.then(() => resultMap);

答案 1 :(得分:1)

@trincot已经解释了语法错误,但是我建议不要构造return Promise.all(promises).then(() => { return resultMap; });,除非获得所有结果:

Map