我有以下代码

import fetch, { Response } from "node-fetch"
import { joinCookieNameAndValue } from "../string-manipulation"
import item from "../../types/data-types/item"

const scan = (name: string, page: number): Promise<item | void> => new Promise(async (resolve, reject) => {
    const itemsRes: Response = await fetch(`url`, {
        method: "GET",
        headers: {
            Cookie: joinCookieNameAndValue("cookie-name", <string> process.env.COOKIE_VALUE)
        }
    })

    if (!itemsRes.ok) {
        return reject(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 resolve();
    }

    if (!item_) {
        return scan(name, ++page);
    }

    resolve(item);
})

export default async (name: string) => scan(name, 1);

上面的promise 在另一个脚本中等待,但它之后的代码将永远不会运行,因为即使items.length == 0if语句中的代码运行,promise 也永远不会得到解析.

推荐答案

您的代码中发生了许多奇怪的事情,但关键问题确实是,在函数的第二次退出时,您立即返回,promise (使用初始的new Promise()创建)将永远不会解决.

此外,一旦一个promise 被解决,它可以再次被解决.一旦它从挂起状态转换到已解决/已拒绝状态,该状态(以及随附的值)就是永久性的.

然而,解决这个问题的最好方法是摆脱那些被认为是坏事的东西,不要将new Promise与异步/等待一起使用.

以下是你分享的代码的重写版本:

async function scan(name: string, page: number): PromiseLike<item | null> {
  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 null;
  }

  if (!item_) {
    return scan(name, page+1);
  }

  return item;
}

export default (name: string) => scan(name, 1);

Javascript相关问答推荐

响应式JS DataTable中的Bootstrap 5弹出程序无法正常工作

为什么有些库公开了执行相同任务的方法,但每个方法都处于同步/同步上下文中?

如何访问react路由v6加载器函数中的查询参数/搜索参数

通过在页面上滚动来移动滚动条

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

Exceljs:我们在file.xlsx(...)&#中发现了一个问题'"" 39人;

为什么promise对js中的错误有一个奇怪的优先级?

rxjs插入延迟数据

在forEach循环中获取目标而不是父对象的属性

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

使用js构造一个html<;ath&>元素并不能使其正确呈现

覆盖加载器页面避免对页面上的元素进行操作

在画布中调整边上反弹框的大小失败

自定义确认组件未在vue.js的v菜单内打开

AJAX POST在控制器中返回空(ASP.NET MVC)

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

ngOnChanges仅在第二次调用时才触发

我不知道如何纠正这一点.

如何使用Reaction路由导航测试挂钩?

JSX/React -如何在组件props 中循环遍历数组