JavaScript创建Promise
本文简述JavaScript创建Promise的几种方式。
总的来说,JavaScript有4种方式创建Promise:
- Promise构造器
- 静态函数
Promise.resolve()
和Promise.reject()
- Promise链中的
then()
函数和catch()
函数 - 调用
async
函数
Promise构造器
Promise的构造器只接收一个参数——executor
函数。当调用new Promise(executor)
时,JavaScript会立即执行executor
函数,传入2个参数:resolve()
和reject()
。
1 | function executor(resolve, reject) { |
executor()
函数的作用,可以调用resolve()
将Promise标记为fulfilled(成功),或调用reject()
标记为rejected(失败)。
1 | const success = new Promise(function executor(resolve) { |
静态函数
Promise.resolve()
函数可以创建一个Promise,随后立即变为fulfilled。
1 | const p = Promise.resolve(42); |
可以认为Promise.resolve(v)
是new Promise(resolve => resolve(v))
的简写。
类似的,Promise.reject()
函数可以创建一个立即标记为rejected的Promise。
1 | const p = Promise.reject(new Error('Oops!')); |
用Promise.reject()
时要小心:如果没有在其后加上.catch()
,会发生“未处理的Promise异常”。
then()和catch()
在调用.then()
或.catch()
时,JavaScript会创建一个新的Promise。
1 | const p = Promise.resolve('Hello'); |
async函数
在调用async
函数时,JavaScript会返回一个新的Promise。无论async
函数中返回的是什么,JavaScript都会返回一个Promise,一定要在async
函数调用时加上await
!
1 | async function test() { |
不立即执行
JavaScript的Promise在创建时会立即执行executor
函数,从这个角度来看,Promise是“热启动”的。
如果你需要一个“冷启动”的Promise,在创建时不执行,直到用await
时才执行,那么你应该使用async
函数。每次调用一个async
函数都会返回一个新的Promise。
1 | async function getAnswer() { |
另一种常见方式是延迟模式,可以创建一个Promise,但是在executor
函数之外调用resolve()
和reject()
函数。
1 | Promise.deferred = function() { |
然而延迟模式是一种反模式,因为executor
函数之外发生的同步错误,不会把Promise标记为rejected!
1 | // JavaScript会捕获Promise的executor中发生的任何错误 |