promise相关基础之状态 ,resolve ,then

promise
语法上:它本质上是一个对象,用于获取异步的一些消息。
语义上:承诺它过一段时间会给你一个结果
promise异步编程的一种解决方案

异步编程

异步编程,通俗的解释就是,我们封装一个网络请求的函数,因为不能立刻返回结果,所以我们可以将其(异步请求的结果)传入另外一个函数,在数据请求成功时,将数据通过传入的函数回调回去。

异步解决方法

setTimeout 是异步 ajax也能异步请求

现在解决异步主要方案:回调函数

 $.ajax({
            url: '/api/...,
            type: 'GET',
            dataType: 'json'
        })
            .done(function(data) {
                children_tableInstance.emptyTable();
                children_tableInstance.data = data;
                children_tableInstance._fillTableData();
                children_tableInstance.addEmptyRow();
            })
            .fail(function() {

            })
            .always(function() {

            });

理解回调函数

被作为实参传给另外一个函数,并在该外部函数内部被调用的函数

function greeting(name){
 alert("hello"+name)
}
function Userinput(callback){//作为实参
  let name="Lily";
  callback(name);//在函数内部被调用
}
Userinput(greeting);

理解promise

  1. Promise 可以理解是一个容器,里面保存着某个将来才会结束的事件(异步操作)的结果;从语法上说,Promise 是一个对象通过它可以获取异步操作的消息;Promise 提供了统一的 API ,各种异步操作都可以用同样的方法进行处理。

promise 的三种状态

Promise对象有三种状态,他们分别是:

1.pending: 等待中,或者进行中,表示还没有得到结果 :异步 请求还没返回结果
2.resolved(Fulfilled): 已经完成,表示得到了我们想要的结果,可以继续往下执行
3.rejected: 也表示得到结果,但是由于结果并非我们所愿,因此拒绝执行

Promise对象的状态改变,只有两种可能:从pending变为 fulfilled 和从pending变为rejected,一旦确定就不会再改变 ,这句话反复出现 最终无非两个结果 成功或失败 ,所以不可能同时执行resolve() 和reject()

<script>
    function f(){
    return new Promise((resolve,reject)=>{
        setTimeout(function(){
            debugger
            resolve("我是resolve");//此处只会执行resolve
            reject("我是请求错误reject");
        },1000);
    })
}

f().then(function(res){ 
    debugger
    console.log(res);
  }).catch(function(rej){
    console.log(rej);
  })
</script>

创建 Promise

promise 回调函数里的两个参数:resolve reject

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署

const promise = new Promise((resolve, reject) => {
  if (/* 异步操作成功 */) {
    //如果 true ,把容器的状态改为 resolve
    resolve(value)
  } else {
    //如果 false ,把容器的状态改为 reject
    reject(error)
  }
})

var p = new Promise(function(resolve, reject){
    //做一些异步操作
    setTimeout(function(){
        console.log('执行完成');
        resolve('随便什么数据');
    }, 2000);
});    //这样写立即执行了Promise 里的匿名回调函数,这是为啥?

new promise时回调函数为什么立即执行了

什么时候执行resolve,reject方法?

resolve函数的作用:一个异步操作成功之后,才会去调用这个函数,用resolve方法时,Promise的状态就变成fulfilled,即操作成功状态 ,(并把这个异步操作的结果,作为参数传递出去。通过then回调函数)

reject函数:只有在异步操作失败的时候进行调用,就是调用reject方法后,Promise状态变为rejected,即操作失败状态

状态是从pending→fulfilled或

pending→rejected

执行resolve的意义

答:resolve方法会将promise对象的状态从pending(待定)变为fulfilled

// 写法三,帮助理解pending  fulfilled  与resolve函数的关系
const p_resolve = new Promise((resolve, reject) => {
    setTimeout(function(){
        console.log('p_resolve')
        resolve();
        console.log(p_resolve) //Promise {<fulfilled>: undefined}
        },1000);
    })
console.log(p_resolve)  //Promise {<pending>}



//写法四,帮助理解pending  fulfilled  与resolve函数的关系
const p_best = new Promise((resolve, reject) => {
    setTimeout(function(){
        console.log('p_best')
        console.log(p_best) //Promise {<pending>}
        },1000);
    })
console.log(p_best)  //Promise {<pending>}

    //由写法三、四,可得出结论  promise回调函数里,只要不执行resolve方法,promise实例的状态一直是pending,只有执行了resolve方法之后,才是fullfilled状态
// promise执行resolve的意义   resolve方法会将promise对象的状态从pending(待定)变为fulfilled

resolve和reject的区别
执行成功 执行失败

Promise 的实例方法

Proimse 拥有两个是方法 then() 和 catch()

then()这个方法就是在异步操作执行完之后去调用 去执行一个回调函数

Promise 实例生成以后,可以用 then 方法和 catch 方法分别指定 resolved 状态和 rejected 状态的回调函数。 执行resolve()之后会调用then的回调函数

<script>
    let promise=new Promise(function(resolve){
        console.log("promise");
        resolve();
    })
    promise.then(function(){
        console.log('resolved');
    })
    console.log("hello");
    //输出结果:
//  promise
//  hello
//  resolved      promise.then难道是异步的?
</script>

then如何使用

then方法中有两个回调函数作为参数,如果Promise的状态为fulfilled则执行第一个回调函数;如果状态为rejected则执行第二个回调函数

例: p.then(()=>{},()=>{})

调用resolve改变状态时,传递的参数会作为then方法的第一个回调函数的参数;调用reject改变状态时,传递的参数会作为then方法的第二个回调函数的参数

一般reject(new Error(‘reason’))

<script>
//复杂写法
    function f(cb){
        setTimeout(function(){
            cb&&cb();
        },1000)
    }
    f(function(){
        console.log(1);
        f(function(){
            console.log(2);
            f(function(){
                console.log(3);
            })
        })
    })
    </script>
<script>
    //上面属于多层异步操作回调嵌套了
    function f(){
        return new Promise(function(resolve,reject){
            setTimeout(function(){
                resolve();
            },1000)
        })
    };
    f().then(function(){
        console.log(1);
        return f();
    }).then(function(){
        console.log(2);
    })


</script>

then 方法什么时候执行

当Promise的状态由pending->fulfilled的时候执行第一个回调函数,当Promise的状态由pending->rejected的时候执行第二个回调函数;


    let p=new Promise(function(resolve,reject){
        reject(new Error('reason'))
    })
    p.then(function(res){
        console.log(res);//这里无输出
    },function(rej){
        console.log(rej);  // 输出Error: reason
    })
  

补充:

promise构造函数只传入resolve参数,then可以只写有关resolve的回调

 
    let p10=new Promise(function(resolve){
        resolve("操作成功")
    })
    p10.then(function(res){     //这样写说明,可以构造函数只传入resolve参数,then只写有关resolve的回调
        console.log(res);// promise_reject.html:28 操作成功
    })

参考:https://blog.csdn.net/h18377528386/article/details/122741648
https://blog.csdn.net/visibleforest/article/details/119408889

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值