Fetch 是异步操作,nk() 函数本质返回的是一个 Promise,因此直接调用它必然得到 Promise {};正确做法是使用 .then() 链式处理或 await 等待其完成,而非试图“同步获取”结果。
fetch 是异步操作,`nk()` 函数本质返回的是一个 promise,因此直接调用它必然得到 `promise {
在 JavaScript 中,fetch() 天然返回一个 Promise,而 Promise 的链式方法(如 .then())也总是返回新的 Promise——这是设计使然,不是 bug。你代码中的 nk() 函数虽已正确处理响应数据并 return 了最终数组,但该 return 实际是 .then() 回调内的返回值,因此整个函数仍返回一个 fulfilled(或 rejected)的 Promise,而非原始数组。
✅ 正确调用方式(推荐链式写法):
nk(['force'])
.then(result => {
console.log('Resolved data:', result);
// 输出示例: ["base formula for <b>force</b>: F = ma", "contextual definitions: ..."]
})
.catch(error => {
console.error('Fetch failed:', error);
});
✅ 或使用 async/await(需在 async 函数内):
async function handlePhysics() {
try {
const result = await nk(['energy']);
console.log('Energy info:', result);
} catch (err) {
console.error('Failed to load physics data:', err);
}
}
handlePhysics();
⚠️ 注意事项:
- ❌ 不要试图“取消 Promise”或“强制同步取值”——这违背 JavaScript 异步模型;
- ❌ result.json() 是必需的:fetch() 返回的是 Response 对象,.json() 才真正解析 JSON 并返回一个 Promise,跳过它将无法获得 JS 对象;
- ❌ object.keys(nk_json) 应为 Object.keys(nk_json)(大小写敏感),否则会抛出 ReferenceError;
- ✅ 若需在多个地方复用解析后的数据,可考虑缓存 Promise(如 const cached = nk(args);),避免重复请求;
- ✅ 错误处理不可省略:网络中断、JSON 格式错误、404 均会导致 Promise rejected,务必用 .catch() 或 try/catch 捕获。
总结:Promise 的 pending 状态不是问题,而是异步流程的正常中间态。关键在于理解“返回 Promise”是函数的预期行为,消费方必须通过 .then() 或 await 主动解包,而非期待函数“直接返回数组”。掌握这一心智模型,是写出健壮前端异步逻辑的第一步。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











