zoukankan      html  css  js  c++  java
  • 关于Promise,你必须知道的几点。

    1.如何改变promise的状态

      1). resolve(value) 如果当前的状态是pedding 就会改为 resolved

      2). reject(reason) 如果当前状态是pedding 就会改为 rejected

    2.一个promise指定多个成功 / 失败的回调,都会调用吗?

      当promise状态改变时,对应的回调函数都会调用

    const p = new Promise((resolve,reject)=>{
        resolve(1)
    })
    p.then(
        value=>{
            console.log(value)   // 1
        },
        reason=>{
            console.log(reason)
        }
    )
    p.then(
        value=>{
            console.log('value2:' + value)   // value2:1
        },
        reason=>{
            console.log('reason2' + reason)
        }
    )

    3.改变promise的状态和指定回调函数,谁先谁后?

      1). 都有可能,正常情况下时先指定回调函数再改变状态,但也可以先改变状态,再指定回调。

      2). 如何先改变状态,再指定回调函数

        在执行器中直接调用resolve() / reject()

        再延迟更长的时间才调用then

      3). 什么时候才能得到数据

        如果先指定回调函数,当状态改变的时候,回调函数就会被执行,得到数据

        如果先改变状态,那当指定回调时,就会调用回调函数,得到数据

    4. promise.then()返回的新的promise的状态由谁决定?

      1). 简单表达:由then()指定的回调函数的执行结果来决定

      2). 详细表达:

        如果回调函数抛出异常,新的promise变为reject,reason为异常的原因

        如果返回的为非promise的任意值,则状态为resolved value为其返回值

        如果返回的为一个新的promise,状态为新的promise的结果

    5. promise如何串联多个异步操作任务?

      1). promise的then()返回一个新的promise,可以写成then(). 的链式调用

      2). 通过then 的链式调用串联多个 同步/异步 任务

      说明:如果想在then()中执行异步任务,必须返回一个新的promise不能直接调用 resolve / reject

    new Promise((resolve, reject)=>{
        console.log("执行任务1(同步)")
        setTimeout(()=>{
             console.log("执行任务2(异步)")
             resolve(2)
        },1000)
    }).then(
        value =>{
            console.log("任务2的结果");
           console.log("执行任务3(同步)");
           return 3 
        }
    ).then(
        value=>{
            console.log("接受任务3的结果")
            return new Promise((resolve,reject)=>{
                setTimeout(()=>{
                    console.log("执行任务4(异步)")
                    resolve(4)
                })
            })
        }
    ).then(
        value=>{
            console.log("接收任务4的结果")
        }
    )

    6. promise 异常传透

      1). 当使用promise的then链式调用的时候,可以到最后再指定失败的回调函数

      2). 前面的任意操作出现了异常,都会传到最后的失败的回调中处理

    new Promise((resolve,reject)=>{
        reject(2)
    }).then(
        value=>{},
        // reason=>{throw reason}
    ).then(
        value=>{},
        // reason=>{throw reason}
    ).catch(
        reason=>{
            console.log(reason)
            return new Promise(()=>{})   // 返回一个pending状态的promise ,后面的链式调用就不会继续执行
        }
    ).then(   // 这里面将不会继续执行
        value=>{
            
        },
        reason=>{
            
        }
    )
    // 上面的任意一个promise发生错误,都会一层一层的传递到最后一个错误的回调中来处理
    // 如果then()中不传递回调函数,就会默认传递  reason => {throw reason} ,将错误往下抛出

    7. 如何中断Promise链?

      在回调函数中返回一个pedding状态的promise对象

  • 相关阅读:
    Java中的File类
    scala语法
    Spark核心原理
    资源调度器
    YARN工作机制
    MapReduce原理和工作过程
    序列化
    Hbase(2)表的设计和Rowkey等的设计
    Hbase(1)架构和工作原理
    Exception in thread "main" java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator.metric()Lio/netty/buffer/PooledByteBufAllocatorMetric;
  • 原文地址:https://www.cnblogs.com/recode-hyh/p/11945607.html
Copyright © 2011-2022 走看看