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

不使用new Promise()及resolve/reject能否创建Promise?

答案是完全可以

你给出的示例代码本身就是典型的无手动构造Promise的实现,完全不需要显式调用new Promise()、也不需要手写resolve/reject回调就能生成符合要求的Promise实例。
本质逻辑很简单:只要你拿到的是已经存在的Promise实例,调用它的链式方法、或是直接返回它本身,都能得到可用的Promise实例,不需要自己从零构造。

常见的无需手动构造Promise的实现方式
  • 直接返回内置Promise化API的返回值
    现在浏览器、Node.js的绝大多数新异步API本身就直接返回Promise实例,比如你示例里用的fetch,还有Response.json()、剪贴板API、fs/promises模块的所有文件操作方法、原生Promise版定时器等,这些方法执行完本身就是Promise,直接return即可,不需要额外包装。
  • 利用Promise链式调用的自动包装特性
    任意Promise实例调用.then()、.catch()、.finally()时,都会自动返回一个全新的Promise实例:
    • 你在回调里throw错误,这个新Promise会自动变为rejected状态,效果等同于手动调用reject()
    • 你在回调里返回普通值、或是另一个Promise实例,这个新Promise会自动用这个值resolve,或是跟随返回的Promise变更状态,效果等同于手动调用resolve()
      你给出的示例就是这种写法的典型实现:
    export function getItById(id) {
      return fetch(`path`, {
        method: 'GET',
      }).then(rslt => {
        if (!rslt || !rslt.ok) {
          throw new Error('failure !');
        } else {
          return rslt.json();
        }
      });
    }
    
    整个函数没有写一行new Promise,也没有出现resolve/reject的显式调用,但最终返回的完全是标准可用的Promise实例,可以正常接await、.then链式调用。
  • 使用Promise静态方法快速生成实例
    直接调用Promise.resolve()、Promise.reject()、Promise.all()、Promise.race()、Promise.allSettled()、Promise.any()这些内置静态方法,都会直接返回对应状态的Promise实例,不需要手动调用构造函数。比如要快速返回一个携带固定值的成功Promise,直接写return Promise.resolve(你的数据)即可。
什么时候才需要手动写new Promise?

只有当你需要把传统的回调风格(非Promise)API包装成Promise的时候,才需要手动调用new Promise构造器,比如把回调版setTimeout、老版本的回调式Node.js API封装成Promise风格。如果本身已经在处理Promise链、或是调用的API已经返回Promise,再额外套一层new Promise属于典型的Promise反模式,属于完全多余的写法。

内容的提问来源于stack exchange,提问作者aline renault

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:12:21