关于JavaScript中Promise构造函数参数语义的技术问询
Promise构造函数核心疑问解答
先看你提到的示例代码:
let p = new Promise((resolve, reject) => { let a = 1 + 1; if (a == 2) { resolve('Success'); } else { reject('Failed'); } }) p.then((message) => { console.log("this is a success" + message); }).catch((message) => { console.log("this is an error" + message); })
针对你的两个疑问,直接给出解答:
1. Promise构造函数接收的函数参数名可自定义,JavaScript如何识别resolve、reject的语义?
JavaScript完全不关心你给这两个参数起什么名字,它只认参数的位置:
- 你传给Promise构造函数的那个函数(称为executor函数),第一个参数永远是负责触发成功态的回调,第二个永远是负责触发失败态的回调。
- 哪怕你写成
(res, rej)、(ok, fail)甚至(a, b),第一个位置的函数被调用时,就会把Promise的状态改成fulfilled(成功),触发后续的.then();第二个位置的函数被调用时,状态改成rejected(失败),触发后续的.catch()。
比如把代码改成这样,逻辑依然完全生效:
let p = new Promise((ok, fail) => { let a = 1 + 1; if (a == 2) { ok('Success'); } else { fail('Failed'); } }) p.then((message) => { console.log("this is a success" + message); }).catch((message) => { console.log("this is an error" + message); })
2. resolve和reject是被调用的回调函数,但未显式定义,其来源是什么?
这两个函数是Promise构造函数内部自带并自动传递给executor函数的。
当你执行new Promise(...)时,JavaScript引擎会在内部创建这两个内置函数:
resolve函数的作用:将Promise的状态从pending(等待)改为fulfilled(成功),同时保存你传入的成功值,供后续.then()的回调使用。reject函数的作用:将Promise的状态从pending改为rejected(失败),保存你传入的失败原因,供后续.catch()的回调使用。
你不需要自己定义它们,只需要在executor函数里按需调用即可。
内容的提问来源于stack exchange,提问作者kd8
相关产品推荐
相关产品推荐

