如何无需辅助数组与计数器将Promise.all结果转为键值结构?
如何不依赖辅助数组与计数器将Promise.all结果转为键值结构?
原代码实现
你目前的loadFilterMetaData方法返回Promise数组:
private loadFilterMetaData(): Array<Promise<any>> { const country = CatalogCountry.findAll(); const firm = CatalogFirm.findAll(); const promises = [country, firm]; return promises; }
当前通过辅助数组和计数器将结果存入Map:
this.metaDataInjectableFilters=['country','firm']; const metaData = await Promise.all(metaDataPromises); let i = 0; metaData.forEach(resolved => { this.metaData.set( this.metaDataInjectableFilters[i], resolved ); i++; })
无需辅助内容的实现方式
方式1:直接在方法中返回键值Map
修改loadFilterMetaData为异步方法,通过解构Promise.all的结果直接构建Map返回:
private async loadFilterMetaData(): Promise<Map<string, any[]>> { // 并行执行查询,解构得到对应结果 const [country, firm] = await Promise.all([ CatalogCountry.findAll(), CatalogFirm.findAll() ]); // 直接关联键名与结果,返回Map return new Map([ ['country', country], ['firm', firm] ]); }
调用时直接赋值:
this.metaData = await this.loadFilterMetaData();
方式2:用对象包裹Promise,转换为键值结果
如果不想修改原方法,可在调用时用对象映射Promise,再转换为键值结构:
// 用对象存储Promise与对应键名 const promiseObj = { country: CatalogCountry.findAll(), firm: CatalogFirm.findAll() }; // 将对象转为键值对数组,并行执行后转回对象 const resultObj = Object.fromEntries( await Promise.all( Object.entries(promiseObj).map(async ([key, promise]) => [key, await promise]) ) ); // 存入Map this.metaData = new Map(Object.entries(resultObj));
方式3:扩展原方法返回带键的Promise数组
若需保持原方法返回Promise数组的形式,可修改方法返回包含键和Promise的数组:
private loadFilterMetaData(): Array<Promise<[string, any[]]>> { return [ CatalogCountry.findAll().then(res => ['country', res]), CatalogFirm.findAll().then(res => ['firm', res]) ]; }
调用时直接转换为Map:
const resolvedEntries = await Promise.all(this.loadFilterMetaData()); this.metaData = new Map(resolvedEntries);
这些方式都不需要额外的辅助数组和计数器变量,直接在获取结果的环节完成键名与数据的关联。
内容的提问来源于stack exchange,提问作者Sergei Illarionov
相关产品推荐
相关产品推荐

