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

Node 14.0.0下Promise.allSettled报不是函数的解决方法

Node v14.0.0环境下Promise.allSettled is not a function报错修复方案

1. 先核对项目实际使用的Node运行时版本

很多人会把“终端执行node -v查到的全局版本”和“项目启动进程实际加载的Node版本”搞混,哪怕全局显示是v14.0.0,只要项目实际跑的版本低于12.9,就会触发这个报错,常见的错配场景:

  • 用nvm、n这类版本管理器的话,项目目录下如果放了.nvmrc配置,进入目录启动项目时会自动切到配置文件指定的旧版本,不会用你全局默认的14.0.0
  • 用IDE自带的调试功能启动项目时,IDE会优先用自己内置的旧版Node,不会读你系统全局装的Node路径
  • 项目是跑在Docker容器、WSL子系统、远程服务器上的,你本地终端查的版本和实际运行环境的版本根本不是一个
  • 像旧版Electron、Node打包工具这类会内嵌Node的工具,启动时用的是自己内置的低版本Node,和你系统装的14.0.0没关系

你可以直接在项目入口文件的第一行加打印,拿到最准确的运行时版本:
console.log('项目真实运行版本:', process.version)
如果查出来实际运行版本低于12.9,切到对应正确版本就直接解决问题了。

2. 排查全局Promise被代码改写的问题

如果确认跑的真的是v14.0.0还报这个错,基本就是进程启动的时候,原生的全局Promise构造器被替换或者改坏了,导致本来自带的allSettled静态方法丢了,常见的坑点:

  • 引了太老的兼容包,比如core-js@2版本、早期的es6-shim,这类包导入的时候会直接把全局Promise换成自己的实现,而老版本的实现根本没补allSettled
  • 项目里有直接重写全局Promise的代码,比如写了Promise = 自定义的Promise实现,但是自定义类里没加allSettled这个静态方法
  • 老版本的测试框架、构建插件的预处理脚本,在启动时会偷偷改Promise的静态属性,把原生方法弄没了

你可以在调用allSettled的那行代码前面加个打印,看看当前的Promise到底有哪些属性:
console.log('Promise现有静态方法:', Object.getOwnPropertyNames(Promise))
如果输出的列表里找不到allSettled,要么把兼容包的引入位置挪到入口最开头,确保加载的是完整的兼容实现,要么删掉没必要的全局替换Promise的逻辑就行。

3. 零依赖兜底兼容方案

如果环境受限没法改Node版本,也没法动那些改写Promise的第三方依赖,直接在入口文件最前面加几行兼容代码就行,不需要引第三方包:

if (typeof Promise.allSettled !== 'function') {
  Promise.allSettled = (iterable) => {
    return Promise.all(
      Array.from(iterable).map(item => 
        Promise.resolve(item)
          .then(value => ({ status: 'fulfilled', value }))
          .catch(reason => ({ status: 'rejected', reason }))
      )
    )
  }
}

加完重启项目,报错就会消失。

内容的提问来源于stack exchange,提问作者Pierre Olivier Tran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 22:15:06