Promise 构造函数的参数其实只要是个函数就行,给的这个函数甚至可以没有参数。当然,不会有人这么写的,不然用什么 Promise 。
Promise 的构造函数会去调用你给的这个函数,会给你的函数传递两个实参,反映在你的函数上就是需要设两个参数来接收这俩玩意。
new Promise( function ( resolve, reject ) { } )
我这里写的是 resolve 和 reject,但实际上并不要求一定要写这俩名,所以接下来我用“第1个”和“第2个”来称呼。
这两个参数接收的实参是两个函数,是用来改变 Promise 的状态以及传递结果用的。
调用第1个参数接收的函数会让 Promise 变为 fulfilled 状态(原来的 resolve 状态),代表这个 Promise 顺利完成。同时这个函数还可以接收一个参数,这个参数的实参会作为这个 Promise 的结果。
调用第2个参数接收的函数会让 Promise 变为 rejected 状态,代表这个 Promise 失败了。这个函数也可以接收一个参数,实参会作为这个 Promise 的结果,只不过这个结果代表的是 Promise 失败的原因,也就是错误信息。
一旦调用了两者中的任何一个,Promise 的状态与结果就会被锁定,不能再被更改。
一般写的时候会把这俩作为其他异步操作的回调或者在异步操作的回调里去调用。
如果你设计的 Promise 没有失败这种情况,那么不接收第2个参数也是可以的。
接下来说 then。提供给 then 的函数接收到的实参,其实就是 Promise 的结果,这个实参是由 JS 引擎负责传递的。而且 then 其实可以接收两个参数,两个参数都是函数,Promise 成功的时候调用第一个,失败的时候调用第2个,只不过很少会有人去用第2个参数(因为基本都用 catch)。