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中发生的任何错误 |