








本文简述JavaScript创建Promise的几种方式。
总的来说,JavaScript有4种方式创建Promise:
Promise.resolve()和Promise.reject()then()函数和catch()函数async函数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()时,JavaScript会创建一个新的Promise。
1 | const p = Promise.resolve('Hello'); |
在调用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 |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。