You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS/TS中如何获取Promise包裹的字体对象值?验证键值PostScriptName匹配

解决Promise包裹值的属性访问问题

你遇到的核心问题是:对象里的值是Promise实例,而非resolve后的字体对象,直接访问myObj[font].postscriptName其实是在读取Promise对象的属性,自然拿不到有效内容。必须先等待所有Promise完成,拿到实际的字体对象后再做比对。

正确实现步骤

  1. 将对象转换为键值对数组,为每个Promise绑定对应的键;
  2. 等待所有Promise resolve,获取包含键和对应字体对象的数组;
  3. 遍历数组,解析键的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:10:57