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。

原文地址:https://www.cnblogs.com/weizhibin1996/p/9303695.html