调用Promise的resolve()后状态仍为pending,await后代码无法执行
问题分析与修复
核心问题
你的代码存在三个关键问题,导致Promise始终处于pending状态:
- 冗余的Promise嵌套:
scan函数用new Promise(async (resolve, reject) => {})的写法完全没必要——async函数本身就会返回Promise,手动包裹一层反而会让递归逻辑和外层Promise脱节。 - 递归未衔接Promise链:当
!item_触发递归时,你直接return scan(...),但这个递归返回的Promise没有和外层Promise关联,外层Promise完全不知道递归的结果,自然不会改变状态。 - 变量名错误:最后一行
resolve(item)里的item是类型名,不是你定义的变量item_,这不仅会报错,还导致正确结果无法传递。
修复后的代码
import fetch, { Response } from "node-fetch" import { joinCookieNameAndValue } from "../string-manipulation" import item from "../../types/data-types/item" // 直接用async函数返回Promise,无需手动new Promise const scan = async (name: string, page: number): Promise<item | void> => { const itemsRes: Response = await fetch(`url`, { method: "GET", headers: { Cookie: joinCookieNameAndValue("cookie-name", <string> process.env.COOKIE_VALUE) } }) if (!itemsRes.ok) { throw new Error(`Could not fetch items: request failed with status code ${itemsRes.status}`); } const items: Array<item> = await itemsRes.json(); const item_: item | undefined = items.find(i => i.name == name); if (items.length === 0) { return; // async函数return undefined等价于Promise.resolve() } if (!item_) { // 递归调用直接return,让Promise链正确衔接 return scan(name, ++page); } // 修正变量名,返回找到的结果 return item_; } export default async (name: string) => scan(name, 1);
修复说明
- 移除了多余的
new Promise包裹,利用async函数原生的Promise返回特性,避免嵌套逻辑混乱。 - 递归分支直接return递归的
scan调用,让外层Promise等待递归完成后再改变状态,完整衔接Promise链。 - 用
throw替代reject、return替代resolve,完全贴合async/await的语法规范,代码更易读。 - 修正了变量名错误,确保找到的结果能正确传递出去。
内容的提问来源于stack exchange,提问作者iKingNinja
相关产品推荐
相关产品推荐

