• Nodejs里面的promise/async/await


    then()总是返回一个新的promise

    一个promise是一个带有".then()"方法的对象,其代表的是一个操作的结果可能还没有或不知道

    看看promise的用法

    //成功的结果放在resolve里面
    //拒绝promise或者出错就放reject里面
    const pro = new Promise((resolve,reject)=>{
        resolve('HelloWorld');
    });
    
    
    //只能通过then使用
    //不能直接读取promise
    pro.then((result)=>{
        console.log(result);
    })

    1、async函数是一个异步函数,调用它不会阻塞后面的函数。当然现在还看不出他的优势。

    2、await在async内部使用,作用是等待一个函数执行完。也就是会阻塞。

    如果要写一个等待一秒返回的函数

    function doubleAfter2seconds(num) {
    
        setTimeout((num)=>{
            num = num*2;
        },1000);
    
        return num;
    
    }
    
    const num = doubleAfter2seconds(20);
    console.log(num);

    因为是异步的,setTimeout不会阻塞后面的返回语句

    必须这样写 

    function doubleAfter2seconds(num) {
    
        setTimeout((num)=>{
            num = num*2;
            return num;
        },1000);
        
    
    }

    但是这样函数直接就返回,分本没有等待Timeout

    要等待函数执行完才进行下一步,是阻塞的写法,必须await,但是await又只能在async里面。

    function doubleAfter2seconds(num) {
    
        setTimeout((num)=>{
            num = num*2;
            return num;
        },1000);
    
    
    }
    
    async function test (){
        const num = await doubleAfter2seconds(20);
        console.log(num);
    };

    没用

    await要等待promise才能体现效果

    // 2s 之后返回双倍的值
    function doubleAfter2seconds(num) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(2 * num)
            }, 1000);
        } )
    }
    
    async function test (){
        const num = await doubleAfter2seconds(20);
        console.log(num);
    };
    
    test();

    await等待promise,并取出promise.resolve里面的结果

    使用await+promise,就能在async里面写同步代码了!

    //async函数定义
    async function testResult() {
        //因为下面使用了await,所以里面的代码是同步的,这就不需要嵌套的异步回调了
        //因为无论异步同步,都需要三个数都计算完才能计算结果
        let first = await doubleAfter2seconds(30);
        console.log(first);
        let second = await doubleAfter2seconds(50);
        console.log(second);
        let third = await doubleAfter2seconds(30);
        console.log(third);
        console.log(first + second + third);
        return 'ok';
    };
    
    //这样调用,会直接返回promise
    console.log(testResult());
    console.log(testResult().then(result=>{
        return result;
    }));
    console.log('后面的1');
    console.log('后面的2');
    console.log('后面的3');

    可以看到,虽然async函数里面全是同步代码,但是它是一个异步执行的函数。不会阻塞后面的语句

    后面的console语句会先执行,如果直接打印async函数,返回的是promise。

  • 相关阅读:
    kibana操作
    git使用入门
    ES增删改查
    MySQL&ES连接池
    java递归生成树结构的数据
    lambda新特性,对两组集合中相同的数据去重
    java8新特性 LocalDateTime,LocalDate ,LocalTime 使用,Period 获取时间差
    photoshop安装包
    java自定义异常及异常的抛出
    git回滚到任意版本
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9303695.html
Copyright © 2020-2023  润新知