JS/TS中如何获取Promise包裹的字体对象值?验证键值PostScriptName匹配
解决Promise包裹值的属性访问问题
你遇到的核心问题是:对象里的值是Promise实例,而非resolve后的字体对象,直接访问myObj[font].postscriptName其实是在读取Promise对象的属性,自然拿不到有效内容。必须先等待所有Promise完成,拿到实际的字体对象后再做比对。
正确实现步骤
- 将对象转换为键值对数组,为每个Promise绑定对应的键;
- 等待所有Promise resolve,获取包含键和对应字体对象的数组;
- 遍历数组,解析键的JSON字符串,对比
postscriptName。
代码示例(使用async/await)
// 先处理所有Promise,拿到键和对应已解析的字体对象 const resolvedFontEntries = await Promise.all( Object.entries(myObj).map(async ([fontKey, fontPromise]) => { const resolvedFont = await fontPromise; return [fontKey, resolvedFont]; }) ); let allPostscriptNamesMatch = true; for (const [fontKey, resolvedFont] of resolvedFontEntries) { const parsedFont = JSON.parse(fontKey); if (parsedFont.postscriptName !== resolvedFont.postscriptName) { allPostscriptNamesMatch = false; // 发现不匹配后直接终止循环,提升效率 break; } } console.log(allPostscriptNamesMatch);
代码示例(使用.then链式调用)
如果环境不支持async/await,可使用传统Promise链式调用:
Promise.all( Object.entries(myObj).map(([fontKey, fontPromise]) => { return fontPromise.then(resolvedFont => [fontKey, resolvedFont]); }) ).then(resolvedFontEntries => { let allPostscriptNamesMatch = true; for (const [fontKey, resolvedFont] of resolvedFontEntries) { const parsedFont = JSON.parse(fontKey); if (parsedFont.postscriptName !== resolvedFont.postscriptName) { allPostscriptNamesMatch = false; break; } } console.log(allPostscriptNamesMatch); });
补充说明
你之前使用Promise.all可能只是单纯等待所有Promise完成,但未将resolve后的结果与原对象的键关联。上面的写法会在等待Promise的同时保留每个结果对应的键,确保后续能准确完成比对。
内容的提问来源于stack exchange,提问作者sal3jfc
相关产品推荐
相关产品推荐

