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

调用Promise的resolve()后状态仍为pending,await后代码无法执行

问题分析与修复

核心问题

你的代码存在三个关键问题,导致Promise始终处于pending状态:

  1. 冗余的Promise嵌套:scan函数用new Promise(async (resolve, reject) => {})的写法完全没必要——async函数本身就会返回Promise,手动包裹一层反而会让递归逻辑和外层Promise脱节。
  2. 递归未衔接Promise链:当!item_触发递归时,你直接return scan(...),但这个递归返回的Promise没有和外层Promise关联,外层Promise完全不知道递归的结果,自然不会改变状态。
  3. 变量名错误:最后一行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:20:34