关于Javascript——Promise的一些理解

Promise是一个构造函数,promise是通过Promise构造函数声明的对象。

 

promise对象用来“管理”一次异步任务。

 

通过new Promise()声明一个promise对象的时候需要传两个参数,一个是resolve(),一个是reject()。

let promise = new Promise(resolve,reject){......}

这里的resolve和reject,其实就是两个callback。关于callback:建议看这个【一句话攻略】彻底理解JS中的回调(Callback)函数 - Rockage的文章 - 知乎 https://zhuanlan.zhihu.com/p/113069353

这里的resolve和reject可以理解为两个“形参”,不是具体的函数。他们的作用是在声明promise对象的时候,设定好resolve()和reject()的执行时机。

let promise = new Promise(resolve,reject) {
    /*
        这里就写一些代码段,给你声明的promise对象传属性
    */
    const a = 1;
    const b = 2
    const c = 3; //随便你写什么,用来给你的promise对象设置属性的

    if(/*某条件为true,比如说你可以在这里请求Ajax,如果请求成功并且readystate === 4的时候,让他resolve*/)
        {resolve(a)};//就像我上面说的,这里的resolve你就当做一个插槽,他只是表示我要执行resolve()函数了,但具体函数是啥我不知道。同时这里可以给resolve()函数传参,这个参数将作为实参传递进then()里面的函数

    else(/*某条件*/)
        {reject(b)};//和resolve那里一样
}

像我注释里写的一样,这里的resolve()和reject(),只是为了告诉js引擎这里我该执行resolve()或者这里我该执行reject(),而resolve()和reject()具体是什么函数、实现什么样的功能,是需要通过then()传递进来的。

then():Promise构造函数的原型对象上的一个方法,通过promise.then()调用,他最多接收两个参数:第一个参数是resolve(),第二个函数时reject()。这两个函数才是你promise对象真正要执行的函数。

promise.then(function1(value1){/*代码段*/}) //then的第一个参数,就是调用他的那个promise对象的resolve()函数,value1用来接收创建promise实例对象时候给resolve()传的值,在我们的例子里value1 = a = 1

promise.then(null,function2(value2){/*代码段*/}  //then的第二个参数,是调用它的那个promise对象的reject()函数,value2用来接收创建promise实例对象时候给reject()传的值,在我们的例子里value2 = b = 2

到这里,一个最简单的、没有promise链的promise——then就实现了

 

然后我们开始讨论一个问题——then()。

then()接收一个或两个参数:第一个用于完成状态resolve的回调,第二个用于拒绝状态reject的回调。

then()会创建并返回一个新的promise,这个promise用于实现Promise链式流程控制。

如果then()里面的function()的return是一个非promise,他实际上相当于:

//我们习惯的写法
then(function(){
    return '1234';
})

//他内部实际上的样子
then(function(){
    return new Promise.resolve('1234')//如果这个then()后面还有.then(),那么后面的那个.then()就是用来服务这个Promise.resolve('1234')的
})

then(function(){
    throw 'error';
})

then(function(){
    return new Promise.reject('error')
})

如果then()里面的function()的return是一个promise,他实际上就是

then(function(){
    return new Promise(resolve,reject){
        if(/*某个条件*/) resolve(value1);
        else(/*某个条件*/) reject(value2);
    }
}).then()//这个then()继续按照之前的那个逻辑服务上面return的那个promise,就这么一直链下去,形成promise链

所以说整个promise链,用大白话讲他的流程就是:

在promise内部做一些事情,做完了之后(无论成功或者失败,反正用你写的条件来判断),执行为该promise服务的那个then()里面的函数,如果他里面还是promise,那么就循环下去

 

posted @ 2023-03-03 15:08  就叫李狗蛋儿吧  阅读(83)  评论(0)    收藏  举报