不使用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
相关产品推荐
相关产品推荐

