理解 JavaScript 的 async / await

一、async 的作用

1. async 函数是怎么处理它的返回值的 ?


async function testAsync() {
    return "hello boy";
}

const result = testAsync();
console.log(result);



运行.js文件结果:

Promise { 'hello boy' }

# async 函数返回的是一个 Promise 对象;
# 函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象

async 参考文档;

(1) 相关知识点:Promise.resolve() 是什么?;

允许调用时不带参数: 直接返回一个resolved状态的 Promise 对象;
如果希望得到一个 Promise 对象,比较方便的方法就是直接调用Promise.resolve方法;
注意的是:
立即resolve的 Promise 对象,是在本轮“事件循环”(event loop)的结束时,
而不是在下一轮“事件循环”的开始时;
setTimeout(function () {
    console.log(3);
}, 0);
Promise.resolve().then(function () {
    console.log(2);
});
console.log(1);

**结果分析:**
# 上面代码中,setTimeout(fn, 0)在下一轮“事件循环”开始时执行;
# Promise.resolve()在本轮“事件循环”结束时执行,
# console.log(1)则是立即执行,因此最先输出

输出:1 , 2 ,3



二、await 的作用


1 .await [ 等待 ] :等的是什么?

等待的是一个表达式;
表达式的计算结果是 Promise 对象;
或者其它值【就是没有特殊限定】



(1): 因为 async 函数返回一个 Promise 对象; 所以 await 可以用于等待一个 async 函数的返回值;



await 后面是可以接普通函数调用或者直接量;
await 接 async 函数;

function getSomething() {
    return "something";
}

async function testAsync() {
    return Promise.resolve("hello async");
}

async function test() {
    const ele1 = await getSomething();  ## (1await 后面是可以接普通函数调用或者直接量
    const ele12 = await testAsync();    ## (2awaitasync 函数
    console.log(ele1, ele2);
}

test();


2 . await 等到不同的数据, 会怎么样?

await 是个运算符:等到要等的会进行运算

(1): 等到的不是一个 Promise 对象;

运算结果就是它等到的东西;

(2): 等到一个 Promise 对象;

首先: 会阻塞后面的代码;
其次: 等待Promise 对象 resolve;
最终: 获取resolve 的值,作为 await 表达式的运算结果;



三、总结【结合代码例子】:

整体运行流程:

# 1.执行test() 异步函数;
# 2.执行 await takeLongTime();
# 3.注意: await 必须在一个async 异步函数中,例题满足;
# 4.运行中: await 此处等到的是takeLongTime()函数返回的一个Promise对象;;
# 5.运行中:await 等待到一个Promise对象后,会进行运算,等待Promise对象的resolve;
# 6.运行中:resolve 位置处于定时函数中,所以3秒后,resolve触发;;
# 7.运行中:await 最终运算获取resolve的数值,并赋值给const v;
# 8.最终:3秒后 await 的阻塞结束,console语句执行,输出返回结果赋值的V
// takeLongTime()实际就是一个async函数,因为async函数本质就是return一个Promise对象;
function takeLongTime() { 
    return new Promise(resolve => {
        setTimeout(() => resolve("long_time_value"), 3000);
    });
}

async function test() {
// await 必须在一个async 异步函数中;
// await 此处等到的是takeLongTime()函数返回的一个Promise对象;
// await 等待到一个Promise对象后,会进行运算,等待Promise对象的resolve
// resolve 位置处于定时函数中,所以3秒后,resolve触发;
// await 最终运算获取resolve的数值,并赋值给const v;
    const v = await takeLongTime(); 
// 3秒后上一步的阻塞结束,console语句执行,输出返回结果赋值的V;
    console.log(v);  
}

test();





四、结尾:几句话概括async 、await

总结语句 :

1. async 函数是一个返回 Promise对象的函数;
2. await 是一个后面可以跟Promise对象【也就是说可以跟async函数】或者非Promise对象的运算符;
3. await 必须在一个异步函数async中;
4. await 后跟Promise对象会阻塞代码执行,进行运算,直到拿到Promise的resolve中的值;**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值