问题描述
promise的实现过程中,在处理上一个then的返回值,如果遇到普通值(如数字,字符串)则直接用当前Promise对象(称作为P2)去resolve,如果then返回值依然是Promise对象(称作为x),则要递归进行x.then(resolve,reject)操作,最后使得P2.resolve('x最后返回值'). 关于这个递归进行resolvePromise的方法不清楚工作机制
相关代码
// 一种实现
function MyPromise(fn) {
var value = null;
var status = 'pending';
var deferreds = [];
this.then = function (onFulfilled) {
return new MyPromise(resolve => {
if (status === 'pending') {
deferreds.push({
onFulfilled: onFulfilled, // resolve
resolve: resolve
});
} else {
var res = onFulfilled(value);
resolve(res);
}
})
}
function resolve(v) {
setTimeout(function () {
if (v instanceof MyPromise) {
v.then(resolve); // 如果v是一个promise,那就会等待v这个promise成完成态的时候,再次触发当前promise的resolve方法。
} else {
value = v;
status = 'fulfilled'
deferreds.forEach(function (deferred) {
var res = deferred.onFulfilled(value);
deferred.resolve(res); // 回调函数的返回值 会传给下一个promise进行resolve
})
}
}, 0)
}
fn(resolve);
}
// 下面我们写段代码验证一下
var p1 = new MyPromise(resolve => {
setTimeout(() => {
resolve('1')
}, 2000)
}).then((res) => {
console.log(res);
return new MyPromise(resolve => {
setTimeout(() => {
resolve(666)
}, 0);
});
}).then(res => {
console.log(res + 222)
})
//console.log(p2 instanceof MyPromise)
请问下当resolve方法遇到值为Promise 是如何进行的,并最后把值传递的
待解决
悬赏分:20
- 离问题结束还有 163天16小时55分48秒
点赞 0反对 0举报 0
收藏 0
分享 4
