加载中...
PAGE

js 实现简易版promise

Post on 2021-10-27 12 0

实现一个简易版的promise,并非完全符合Promise / A+ 规范,仅供学习使用

function myPromise(fn){ const that = this; that.state = "pending"; that.vaule = null; that.resolveCallBacks = []; that.rejectCallBacks = []; function resolve(value){ if(value instanceof myPromise){ return value.then(resolve,reject); } setTimeout(()=>{ if(that.state == "pending"){ that.state = "resolve"; that.value = value; that.resolveCallBacks.map(cb=>cb(that.value)); } },0) } function reject(value){ if(that.state == "pending"){ that.state = "reject"; that.value = value; that.rejectCallBacks .map(cb=>cb(that.value)); } } try{ fn(resolve,reject) }catch(err){ reject(err) } } myPromise.prototype.then = function(onFulfilled,onRejected){ const that = this; onFulfilled = typeof onFulfilled == "function"?onFulfilled:v=>v; onRejected = typeof onRejected == "function"?onRejected:v=>{throw v}; if(that.state == "pending"){ return new myPromise((resolve,reject)=>{ that.resolveCallBacks.push(()=>{ try{ let x = onFulfilled(that.value) resolve(x) }catch(err){ reject(err) } }) that.rejectCallBacks .push(()=>{ try{ let x = onRejected(that.value) resolve(x) }catch(err){ reject(err) } }) }) } if(that.state == "resolve"){ return new myPromise((resolve,reject)=>{ try{ let x = onFulfilled(that.value) resolve(x) }catch(err){ reject(err) } }) } if(that.state == "reject"){ return new myPromise((resolve,reject)=>{ try{ let x = onRejected(that.value) resolve(x) }catch(err){ reject(err) } }) } } //测试 new myPromise((resolve,reject)=>{ console.log("myPromise") setTimeout(()=>{ console.log("myPromise resolve") resolve(10) },1000) }).then(res=>{ console.log("myPromise then:",res) return 100 }).then(res=>{ console.log("myPromise then:",res) }) console.log("test")

下面是更简易的版本,无then的链式调用的

function myPromise(fn){ const that = this; that.state = "pending"; that.vaule = null; that.resolveCallBacks = []; that.rejectCallBacks = []; function resolve(value){ setTimeout(()=>{ if(that.state == "pending"){ that.state = "resolve"; that.value = value; that.resolveCallBacks.map(cb=>cb(that.value)); } },0) } function reject(value){ if(that.state == "pending"){ that.state = "reject"; that.value = value; that.rejectCallBacks .map(cb=>cb(that.value)); } } try{ fn(resolve,reject) }catch(err){ reject(err) } } myPromise.prototype.then = function(onFulfilled,onRejected){ const that = this; onFulfilled = typeof onFulfilled == "function"?onFulfilled:v=>v; onRejected = typeof onRejected == "function"?onRejected:v=>{throw v}; if(that.state == "pending"){ that.resolveCallBacks.push(onFulfilled) that.rejectCallBacks .push(onRejected) } if(that.state == "resolve"){ onFulfilled(that.value) } if(that.state == "reject"){ onRejected(that.value) } } //测试 new myPromise((resolve,reject)=>{ console.log("myPromise") setTimeout(()=>{ console.log("myPromise resolve") resolve(10) },1000) }).then(res=>{ console.log("myPromise then:",res) }) console.log("test")
ubuntu16.04 mysql 修改server_uuid

ubuntu16.04 mysql 修改server_uuid

阅读更多
服务器文件上传500报错,500 InternalServerError

服务器文件上传500报错,500 InternalServerError

阅读更多
CSS animation 属性

CSS animation 属性

阅读更多

暂无评论

    发表评论
    返回顶部
    X