接着上篇Promise A+规范基础介绍,继续学习Promise解决过程:
Promise 解决过程具体过程如下图所示,
具体执行如下:
运行 [[Resolve]](promise2, x) 需遵循以下步骤:
-
x与promise2相等
var promise1 = new Promise((resolve, reject) => {
resolve('promise1 resolve ok~');
});
// return x
var promise2 = promise1.then((value) => {
//1 promsie 与 x 相等
x = promise2;
return x;
})
-
x为 Promise
比如:x为promise1,则then返回的promise2的状态又promise1决定~
var promise1 = new Promise((resolve, reject) => {
resolve('promise1 resolve ok~');
});
// return x
var promise2 = promise1.then((value) => {
//x为promise1
x = promise1;
return x;
})
-
x为对象或函数
(1)、x,为对象,且存在then熟悉,把 x.then 赋值给 then, 如果取 x.then 的值时抛出错误 e ,则以 e 为据因拒绝 promise;
如果x.then是函数,将 x 作为函数的作用域 this 调用之,传递两个回调函数作为参数,第一个参数叫做 resolvePromise ,第二个参数叫做 rejectPromise:
-
如果
resolvePromise以值y为参数被调用,则运行[[Resolve]](promise, y) -
如果
rejectPromise以据因r为参数被调用,则以据因r拒绝promise -
如果
resolvePromise和rejectPromise均被调用,或者被同一参数调用了多次,则优先采用首次调用并忽略剩下的调用 -
如果调用
then方法抛出了异常e:- 如果
resolvePromise或rejectPromise已经被调用,则忽略之 - 否则以
e为据因拒绝promise
- 如果
-
如果
then不是函数,以x为参数执行promise
var promise1 = new Promise((resolve, reject) => {
resolve('promise1 resolve ok~');
});
// return x
var promise2 = promise1.then((value) => {
//
x = {
name: 'linklogis',
age: 6,
// then是函数,将 `x` 作为函数的作用域 `this` 调用之
// 传递两个回调函数作为参数,第一个参数叫做 `resolvePromise` ,第二个参数叫做 `rejectPromise`:
then(resolvePromise, rejectPromise) {
resolve(this.name)
}
};
return x;
})
运行结果:
(2)、 如果 x 不为对象或者函数,以 x 为参数执行 promise
var promise1 = new Promise((resolve, reject) => {
resolve('promise1 resolve ok~');
});
// return x
var promise2 = promise1.then((value) => {
//
x = {
name: 'linklogis'
};
return x;
})
运行结果:
接下来将实现手写Promise