Promise、手写一个Promise

5 篇文章 0 订阅

Promise

1、如何创建一个 new Promise(课堂里让大家背过)
2、如何使用 Promise.prototype.then(可查 MDN)
3、如何使用 Promise.all(可查 MDN)
4、如何使用 Promise.race(可查 MDN)

function fn(){
    return new Promise((resolve, reject) =>{
    //异步代码
        成功时调用 resolve(数据)
        失败时调用 reject(错误)
    })
}
fn().then(onsuccess, onfail)
        .then(onsuccess2, onfail2)
        .catch(onerror)
        .always(onother)

promise后面( )的内容为回调,条件达成了帮你去做某事,比如console.log():指向的是.then的第一个成功函数

Promise.all([promise1,promise2]).then(success1,fail1)

promise1和promise2都成功才会调用success1

Promise.race([promise1,promise2]).then(success1,fail1)

promise1和promise2只要有一个成功就会调用success1
promise1和promise2只要有一个失败就会调用fail1
总之,谁第一个成功或失败,就认为是race的成功或失败

手写一个Promise

function fn(){
    return new Promise((resolve, reject) =>{
    //异步代码
        成功时调用 resolve(数据)
        失败时调用 reject(错误)
    })
}
//类似new Function('x','y','return x+y');new Array(len)等,new Promise()中的参数是异步成功后要报出的号码

//异步操作:成功后resolve报出号码,resolve就是.then的第一个成功函数
fn().then(()=>{},()=>{})

从哪来:自定义class对象,声明方法
到哪去:要实现状态变化、函数执行、.then 下面这个函数

p= new Promise2((resolve,reject)=>{
    setTimeout(() =>{
        resolve(100)
    },1000)
})
p.then((data)=>console.log(data))

在Promise2这个自定义对象中,要处理的是异步成功后报出号码
//异步分为成功和失败(成功执行resolve、失败reject)
//怎么知道成功:setTimeout1秒后执行resolve()、
// 怎么报出:把自定义的this.resolve作为resolve()来执行(resolve是一个参数)
// 改变state状态、再是把.then的第一个成功函数作为succeed函数执行
(.then的第一个成功函数成为resolve()来执行:this.succeed = succeed)

class Promise2{
    succeed = null
    fail = null
    state = 'pending'
    constructor(fn){
        fn(this.resolve.bind(this),this.reject.bind(this))
    }
    //某个时机到了,调用resolve方法,状态改为fulfilled
    resolve(result){
        setTimeout(() =>{
            this.state= 'fulfilled'
            this.succeed(result)
            
        })
    }
    //如果中间出错了,改为调用reject
    reject(reason){
        setTimeout(() =>{
            this.state= 'rejected'
            this.fail(reason)
        })
    }
    then(succeed,fail){
        this.succeed = succeed
        this.fail =fail
    }
}
p= new Promise2((resolve,reject)=>{
    setTimeout(() =>{
        resolve(100)
    },1000)
})
p.then((data)=>console.log(data))
//undefined(函数输出)
//100
p.state
//fulfilled

在这里插入图片描述
new Promise2()这里面的箭头函数相当于参数,传给constructor(),也就是fn

(resolve,reject)=>{
    setTimeout(() =>{
        resolve(100)
    },1000)
}

constructor(fn){
fn(this.resolve.bind(this),this.reject.bind(this))
    }
可参考class写法
constructor()里就是函数的参数

原:function Person(name,age){
    this.name=name
    this.age= age
}
Person.prototype.sayHi=function(){}

新:class Person{
    constructor(name,age){
        this.name= name;
        this.age = age
    }
    sayHi(){ console.log() }
}
//某个时机到了,调用resolve方法,状态改为fulfilled
    resolve(result){
        setTimeout(() =>{
            this.state= 'fulfilled'
            this.succeed(result)
            
        })
    }
    //时机一到,就去修改succeed

    then(succeed,fail){
        this.succeed = succeed
        this.fail =fail
    }

、、、、、、、、、、
p= new Promise2((resolve,reject)=>{
    setTimeout(() =>{
        resolve(100)
    },1000)
})
p.then((data)=>console.log(data))

最终梳理

到哪去:要实现状态变化、函数执行、.then 下面这个函数
new Promise2对象解决异步问题,
相当于new Function(‘x’,‘y’,‘return x+y’) ,告诉新函数对象要去做的事
这里也是告诉Promise对象要去做的事

某个时间到了(setTimeout(()=>{},1000))就报号提醒(resolve(100))

从哪来:自定义class对象,声明方法
新函数要去整合
new Promise相当于什么,有什么功能,参数接的是Array的len,还是Function的’return ’

class相当于自己定义了一个对象,然后给这个对象赋上方法和参数

Promise参数是一个函数,做的事是时间到了后报号提醒
这个作为参数的函数怎么去执行

constructor( fn){   //作为参数
    //让这个传进来的函数执行
    //相当于 function  ( resolve,reject ){   
    //           setTimeout(() =>{
    //                resolve(100)
    //                },1000)
    //  }(  this.resolve  ,  this.reject  )   这里的执行传的是Promise自定义的this.resolve和reject方法
   
fn( this.resolve  ,  this.reject )
}
类似于    //私有属性
constructor( name,age){  this.name = name;this.age= age }

怎么判断成功还是失败(resolve还是reject):1秒后执行resolve

触发自定义的resolve方法:做放出数据的处理(报号)

this.resolve( data ){
    setTimeout({
        this.state= fulfilled
        this.succeed ( data)
    })
}

这里的succeed函数是怎么来的
又是怎么把数据给放出来

当p=new Promise2()
执行p.then((data)=>console.log(data))时

触发自定义的then方法,把执行的.then()中的函数传给this.succeed
让this.resolve中的succeed来执行console.log()

this.then(succeed){
    this.succeed  =  succeed
}

衔接this.resolve里的this.succeed

this.resolve( data ){
    setTimeout({
        this.state= fulfilled
        this.succeed ( data)
    })
}

我的错误理解

对Promise的理解错误
以为 new Promise2((resolve,reject)=>{
setTimeout(() =>{
resolve(100)
},1000)
})这里resolve执行的是报号,后面的.then是有人去提醒,把这两个拆开来看了

其实resolve就是后面的第一个.then

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值