我花了很多时间试图弄清楚这一点。不幸的是,对于任何精通 JS 语法的人来说,都不会真正理解这个问题......
对我来说,在解开简洁的 JS 语法糖之后就很清楚了:
function promise_executor(resolve_callback_provided_by_promise_instance, reject_callback_provided_by_promise_instance) {
if (<some_condition>) {
// success
var response='bla';
resolve_callback_provided_by_promise_instance(response);
} else {
// fail
var error=new Error('failed');
reject_callback_provided_by_promise_instance(error);
}
}
var promise_instance = new Promise(promise_executor);
所以reject 和resolve 只是promise 实例将调用的回调的随机名称。
它们有适当的接口,就像两者都需要 1 个对象类型的参数。该参数将被传递给 Promise.then() 或 Promise.catch()。
resolve
reject
然后,当你使用它们时,它是这样的:
function success_callback(param_from_resolve) {
console.log('success() ', param_from_resolve);
}
function fail_callback(param_from_reject) {
console.log('fail(): ', param_from_reject);
}
promise_instance
.then(success_callback) // this will be the var 'resolve' from above
.catch(fail_callback); // this will be the var 'error' from above
整个代码流程是这样的:
promise_executor() 代码会使用 2 个函数作为参数调用>
// obviously, the promise_executor() function has its own name in the Promise object
promise_executor(Promise.reject, Promise.resolve);
promise_executor() 将-希望-调用resolve或reject回调,这将反过来触发then()或catch()的回调>
then()>
resolve_callback_provided_by_promise_instance(response) 获取response 参数并将其提供给来自then() 的回调>
param_from_resolve(response)
它会像这样下降(这不是实际发生的事情,因为实际上,微队列、事件循环等都参与其中——这是正在发生的事情的要点的线性化版本):
你所看到的:
var promise = new Promise(promise_executor);
执行的内容:
function Promise.constructor(exec_callback_fnc) {
var this = object();
this.exec_callback_fnc = exec_callback_fnc; // this is "promise_executor"
return this;
}
你所看到的:
// at some point in "this.exec_callback_fnc":
resolve_callback_provided_by_promise_instance(response)
执行的内容:
function promise_instance.resolve(param) {
this.param_from_resolve = param;
promise_instance.resolved = true;
}
你所看到的:
promise_instance
.then(success_callback)
执行的内容:
promise_instance.exec_callback_fnc(promise_instance.resolve, promise_instance.reject);
if (promise_instance.resolved) {
function promise_instance.then(callback_fnc) {
callback_fnc(this.param_from_resolve); // this is "success_callback"
}
}
最后,让我们看看,语法如何让整个事情变得更简洁:
function promise_executor(resolve_callback_provided_by_promise_instance,
reject_callback_provided_by_promise_instance) {
if (<some_condition>) {
// success
var response='bla';
resolve_callback_provided_by_promise_instance(response);
} else {
// fail
var error=new Error('failed');
reject_callback_provided_by_promise_instance(error);
}
}
var promise_instance = new Promise(promise_executor);
function success_callback(param_from_resolve) {
console.log('success() ', param_from_resolve);
}
function fail_callback(param_from_reject) {
console.log('fail(): ', param_from_reject);
}
promise_instance
.then(success_callback)
.catch(fail_callback);
会变成:
new Promise((resolve_callback_provided_by_promise_instance,
reject_callback_provided_by_promise_instance) => {
if (<some_condition>) {
// success
var response='bla';
resolve_callback_provided_by_promise_instance(response);
} else {
// fail
var error=new Error('failed');
reject_callback_provided_by_promise_instance(error);
}})
// "response" -> "param_from_resolve"
.then((param_from_resolve) => { console.log('success() ', param_from_resolve); })
// "error" -> "param_from_reject"
.catch((param_from_reject) => { console.log('fail(): ', param_from_reject); });