手写实现一个promise

function myPromise (callback) {

let self = this;

self.status = 'pending';

self.value = undefined;

self.reason = undefined;

self.fullFiledArr = [];

self.rejectedArr = [];

function resolve (value) {

if(self.status == 'pending') {

self.value = value;

self.status = 'fufilled';

self.fullFiledArr.forEach(function(f) {

f.call(this,self.value)

});

}

}

function reject (reason) {

if(self.status == 'pending') {

self.reason = reason;

self.status = 'rejected';

self.rejectedArr.forEach(function(f) {

f(self.reason)

});

}

}

try{

callback(resolve,reject);

} catch(e) {

reject(e);

}

}

myPromise.prototype.then = function (onFufilled,onRejected) {

let self = this;

let myPromise2;

switch(self.status) {

case 'pending':

myPromise2 = new myPromise(function(resolve,reject) {

self.fullFiledArr.push(function(){

try{

let res = onFufilled(self.value);

if(res instanceof myPromise) {

res.then(resolve,reject);

}

// resolvePromise(myPromise,res);

} catch(e) {

reject(e);

}

})

self.rejectedArr.push(function(){

try{

let res = onRejected(self.reason);

if(res instanceof myPromise) {

res.then(resolve,reject);

}

} catch(e) {

reject(e);

}

})

});

break;

case 'fufilled':

myPromise2 = new myPromise(function(resolve,reject) {

try{

let res = onFufilled(self.value);

if(res instanceof myPromise) {

res.then(resolve,reject);

}

} catch(e) {

reject(e);

}

});

break;

case 'rejected':

myPromise2 = new myPromise(function(resolve,reject) {

try{

let res = onRejected(self.reason);

if(res instanceof myPromise) {

res.then(resolve,reject);

}

} catch(e) {

reject(e);

}

})

}

return myPromise2;

}

 

function resolvePromise(promise,x,resolve,reject){

if(promise===x){

throw new TypeError("type error")

}

let isUsed;

if(x!==null&&(typeof x==="object"||typeof x==="function")){

try{

let then=x.then;

if(typeof then==="function"){

//是一个promise的情况

then.call(x,function(y){

if(isUsed)return;

isUsed=true;

resolvePromise(promise,y,resolve,reject);

},function(e){

if(isUsed)return;

isUsed=true;

reject(e);

})

}else{

//仅仅是一个函数或者是对象

resolve(x)

}

}catch(e){

if(isUsed)return;

isUsed=true;

reject(e);

}

}else{

//返回的基本类型,直接resolve

resolve(x)

}

}


 

const async1 = () => {

var p = new myPromise((resolve,reject)=> {

console.log('1');

setTimeout(()=>{

resolve('链式调用1');

},1000)

})

return p;

}

const async2 = () => {

var p = new myPromise((resolve,reject)=> {

console.log('2');

setTimeout(()=>{

resolve('链式调用2');

},1000)

})

return p;

}

 

async1().then((data) => {

console.log(data);

return async2();

}).then((data)=>{

console.log(data);

})

 

好的,以下是一个简单的手写Promise实现: ```javascript class MyPromise { constructor(executor) { this.state = 'pending'; this.value = null; this.reason = null; this.onFulfilledCallbacks = []; this.onRejectedCallbacks = []; const resolve = (value) => { if (this.state === 'pending') { this.state = 'fulfilled'; this.value = value; this.onFulfilledCallbacks.forEach((callback) => callback(this.value)); } }; const reject = (reason) => { if (this.state === 'pending') { this.state = 'rejected'; this.reason = reason; this.onRejectedCallbacks.forEach((callback) => callback(this.reason)); } }; try { executor(resolve, reject); } catch (error) { reject(error); } } then(onFulfilled, onRejected) { onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : (value) => value; onRejected = typeof onRejected === 'function' ? onRejected : (reason) => { throw reason; }; const promise2 = new MyPromise((resolve, reject) => { if (this.state === 'fulfilled') { setTimeout(() => { try { const x = onFulfilled(this.value); this.resolvePromise(promise2, x, resolve, reject); } catch (error) { reject(error); } }, 0); } else if (this.state === 'rejected') { setTimeout(() => { try { const x = onRejected(this.reason); this.resolvePromise(promise2, x, resolve, reject); } catch (error) { reject(error); } }, 0); } else { this.onFulfilledCallbacks.push(() => { setTimeout(() => { try { const x = onFulfilled(this.value); this.resolvePromise(promise2, x, resolve, reject); } catch (error) { reject(error); } }, 0); }); this.onRejectedCallbacks.push(() => { setTimeout(() => { try { const x = onRejected(this.reason); this.resolvePromise(promise2, x, resolve, reject); } catch (error) { reject(error); } }, 0); }); } }); return promise2; } catch(onRejected) { return this.then(null, onRejected); } resolvePromise(promise2, x, resolve, reject) { if (promise2 === x) { reject(new TypeError('Chaining cycle detected')); } let called = false; if (x instanceof MyPromise) { x.then((value) => { this.resolvePromise(promise2, value, resolve, reject); }, (reason) => { if (!called) { called = true; reject(reason); } }); } else if (x !== null && (typeof x === 'object' || typeof x === 'function')) { try { const then = x.then; if (typeof then === 'function') { then.call(x, (value) => { if (!called) { called = true; this.resolvePromise(promise2, value, resolve, reject); } }, (reason) => { if (!called) { called = true; reject(reason); } }); } else { resolve(x); } } catch (error) { if (!called) { called = true; reject(error); } } } else { resolve(x); } } static resolve(value) { return new MyPromise((resolve) => { resolve(value); }); } static reject(reason) { return new MyPromise((resolve, reject) => { reject(reason); }); } static all(promises) { const results = []; return new MyPromise((resolve, reject) => { for (let i = 0; i < promises.length; i++) { const promise = promises[i]; if (!(promise instanceof MyPromise)) { promise = MyPromise.resolve(promise); } promise.then((value) => { results[i] = value; if (results.length === promises.length) { resolve(results); } }, (reason) => { reject(reason); }); } }); } static race(promises) { return new MyPromise((resolve, reject) => { for (let i = 0; i < promises.length; i++) { const promise = promises[i]; if (!(promise instanceof MyPromise)) { promise = MyPromise.resolve(promise); } promise.then((value) => { resolve(value); }, (reason) => { reject(reason); }); } }); } } ``` 这个实现包含了Promise的基本功能,包括resolve、reject、then、catch、resolvePromise等方法,并且还实现Promise.all和Promise.race方法。但是这个实现并不完整,还有很多细节需要考虑和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值