鍍金池/ 問答/HTML/ 請(qǐng)問es7的一個(gè) async/await, await為什么有的時(shí)候是可以省略的

請(qǐng)問es7的一個(gè) async/await, await為什么有的時(shí)候是可以省略的?

測試代碼:


async function fun1(){
    return fun2();// 這里的 await 為什么可以省略?加上await結(jié)果也是一樣的
}
async function fun2(){
    return fun3();// 這里的 await 為什么可以省略?加上await結(jié)果也是一樣的
}

async function fun3(){
    return new Promise(resolve=>{
        console.log('fun3');
        resolve('fufff 3 ret');
    })
}

async function testfun1(){
    const ret = await fun1();
    console.log(ret);
}
testfun1()

fun1 fun2 加不加 await 輸出都是一樣的.

fun3
fufff 3 ret

這到底是為什么呢?

回答
編輯回答
久愛她
  1. 首先,awati后面應(yīng)該跟Promise實(shí)例。
  2. 其次,async函數(shù)返回的是Promise實(shí)例。

具體到樓主的例子,fun1、fun2前面的async是多余的,因?yàn)?fun1() => fun2() => fun3() 已經(jīng)返回了Promise實(shí)例。

可以改成下面的代碼。

function fun1() {
    return fun2(); // 這里的 await 為什么可以省略?加上await結(jié)果也是一樣的
}

function fun2() {
    return fun3(); // 這里的 await 為什么可以省略?加上await結(jié)果也是一樣的
}

function fun3() {
    return new Promise(resolve => {
        console.log('fun3');
        resolve('fufff 3 ret');
    });
}

async function testfun1() {
    const ret = await fun1();
    console.log(ret);
}

testfun1()

對(duì)比下面的例子,可能更直觀

function bar () {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('bar');
        }, 1000);
    });
}

async function foo () {
    let ret1 = bar();
    let ret2 = await bar();
    console.log(ret1); // Promise { 'bar' }
    console.log(ret2); // bar
}

foo();
2018年7月6日 16:31