this.status = XPromise.RESLOVE
}
}
reject(value){
if(this.status === XPromise.PENDING){
this.value = value
this.status = XPromise.REJECT
}
}
}
- promise内部是有错误检查机制的,如果代码有错误的地方会立即将下一个promise的状态改成失败的状态,并携带错误信息
// 错误检查机制,本质上就是try-catch就可以实现了
class XPromise{
…
constructor(func){
…
}
…
then(onreslove,onreject){
// onreslove onreject 分别代表的是then的两个函数
try{
…
}catch(err){
// 有错误直接走到 onreject 函数
onreject(err.message)
}
}
}
-
promise有
reslove
,reject
,all
,race
四个静态方法,后两个传递的promise的数组,前两个可以正常的值或者是promise -
then
方法的返回值也是一个promise,同时具有穿透效果(一个空的then什么的都不做,后面的then可以接受到不操作之前promise) -
promise具有链式操作的功能
class XPromise{
…
constructor(func){
…
}
…
then(onreslove,onreject){
return new XPromise((reslove,reject)=>{
// onreslove onreject 分别代表的是then的两个函数
try{
…
}catch(err){
// 有错误直接走到 onreject 函数
reject(err.message)
}
})
}
}
总结:
最重要的还是我们对第一个promise的封装,因为第一个实现了,后面的一些静态方法返回的都是这个promise,无非就是一个不断重复套娃的操作。
上面的代码片段提供了promise几个重要的点的涉及思路,真正在写的时候如果全部按照那样写会很夸张代码量会特别巨大,是有很多地方是可以进行封装的
完整代码
class XPromise{
static PENDING = ‘pending’
static RESLOVE = ‘reslove’
static REJECT = ‘reject’
constructor(func){
this.status = XPromise.PENDING
this.value = null
this.callBack = []
/*
函数是拥有bind方法,传递一个新的this对象,返回一个函数的复制,同时这个复制的函数的this是修改了传递对象为上下文的函数对象
*/
try {
func(this.reslove.bind(this),this.reject.bind(this))
} catch (error) {
this.reject(error.message)
}
}
reslove(value){
// console.log(‘va’,this)
/*
在外部构造函数调用,这里的this指向的本来应该是window,因为是类 使用的是严格模式 会变成undefined,所以得不到
我们想要的结果,所以可以使用bind强制修改this的绑定
*/
if(this.status === XPromise.PENDING){
this.value = value
this.status = XPromise.RESLOVE
}
/*
只要是执行到 then方法里面的 onreslove 或者是 onreject 方法 说明一定是异步的
所以这里也先用 setTimeOut 来处理
*/
setTimeout(() => {
this.callBack.map(item=>{
item.onreslove(this.value)
})
});
}
reject(reason){
if(this.status === XPromise.PENDING){
this.value = reason
this.status = XPromise.REJECT
}
setTimeout(() => {
this.callBack.map(item=>{
item.onreject(this.value)
})
});
}
then(onreslove,onreject){
let xP = new XPromise((reslove,reject)=>{
/*
如果没有传递函数,就自己封装一个函数,不至于报错种植运行
*/
if(typeof onreslove !== ‘function’){
/* 当没传递 onreslove 的时候,打印onreslove位 undefined typeof undefined 的结果 也是undefined 所以这里只需要检查 typeof onreslove !== ‘function’ 就可以排除其他所有的情况了 */
onreslove = ()=> this.value
}
if(typeof onreject !== ‘function’){
/* 这个是为了解决then的代码穿透问题, 当then没有传递任何参数的时候 只需要把值返回 给下一个then的promise处理即可 */
onreject = ()=>this.value
}
if(this.status === XPromise.PENDING){
this.callBack.push({
onreslove:value=>{
try {
this.parse(xP,onreslove(value),reslove,reject)
} catch (error) {
this.parse(xP,onreject(error.message),reslove,reject)
}
},
onreject:reason=>{
try {
this.parse(xP,onreject(reason),reslove,reject)
} catch (error) {
reject(error.message)
}
}
})
}
if(this.status === XPromise.RESLOVE){
/*
then 方法是异步的,我们可以把它封装到 暂时这里就先把它封装到 setTimeout宏任务队列里,后期再改装成微任务队列
*/
setTimeout(() => {
this.parse(xP,onreslove(this.value),reslove,reject)
}, 0);
}else if(this.status === XPromise.REJECT){
setTimeout(() => {
this.parse(xP,onreject(this.value),reslove,reject)
}, 0);
}
})
return xP
}
parse(xP,result,reslove,reject){
if(xP=== result){
/*
在 promise 中 是不允许出现 一个promise 返回的是 自己本身的这个promise
当返回的是自己本身的时候 就会直接报错
*/
throw new TypeError(‘Chaining cycle detected for XPromise’)
}
try {
if(result instanceof XPromise){
// 在then中返回的是一个 prmise对象
/*
promise的用法是 在 then默认返回的是一个primise,但是其实我们是可以手动自己写一个promise返回的
*/
result.then(res=>{
reslove(res)
},err=>{
reject(err)
})
}else{
reslove(result)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。
因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频文章来源:https://www.toymoban.com/news/detail-853159.html
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
一个总结,更是展示自己能力的重要机会。**
因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
[外链图片转存中…(img-bsKrcP1S-1712530165986)]
[外链图片转存中…(img-iNhaLHfD-1712530165986)]
[外链图片转存中…(img-sOXuz32B-1712530165987)]
既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-eLMFnfTV-1712530165987)]文章来源地址https://www.toymoban.com/news/detail-853159.html
到了这里,关于promise源码实现(宏任务版promise)(1),c语言程序设计小程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!