全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11533174.html,多谢,=。=~

抛出3个疑问:

1、async是干哈的?

2、await在等啥?

3、await等到了又要干哈?

 先说说AsyncFunction

AsyncFunction构造函数用来创建新的异步函数对象,JavaScript中每个异步函数都是AsyncFunction的对象。

new AsyncFunction([arg1[, arg2[, ...argN]],] functionBody)

arg1, arg2, ... argN:函数参数名,一个或多个用逗号隔开的字符串;

functionBody:一段字符串形式的 JavaScript 语句,这些语句组成了新函数的定义;

function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
} var AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;
var a = new AsyncFunction('a',
'b',
'return await resolveAfter2Seconds(a) + await resolveAfter2Seconds(b);');
a(10, 20).then(v => {
console.log(v); // 4 秒后打印 30
});

注:AsyncFunction非全局对象,所以需要通过 Object.getPrototypeOf(async function(){}).constructor 获取

先说明AsyncFunction的原因是执行 AsyncFunction 构造函数时,可以创建一个异步函数对象。但是这种方式不如先用异步函数表达式(也就是async function)定义一个异步函数,然后再调用它来创建异步函数对象来的高效,因为第二种方式中异步函数是与其他代码一起被解释器解析的,而第一种方式的函数体是单独解析的。可以跟下面async的例子对比查看。


接着上async定义+语法

带async关键字的函数,它使得你的函数返回值必定是Promise对象

不明白的可以在console中敲一下下面的代码:

async关键字使用分为异步函数表达式和异步函数语句,两者非常相似,语法也基本相同。它们之间的主要区别在于异步函数表达式可以省略函数名称来创建一个匿名函数。另外,异步函数表达式还可以用在 IIFE (立即执行函数表达式,Immediately Invoked Function Expression) 中。

1、异步函数表达式

async function [name]([param1[, param2[, ..., paramN]]]) { statements }

name:此异步函数的名称,可省略。如果省略则这个函数将成为匿名函数。该名称仅可在本函数中使用。

function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => { resolve(x);
}, 2000);
});
}; // async function expression assigned to a variable
var add1 = async function(x) {
var a = await resolveAfter2Seconds(20);
var b = await resolveAfter2Seconds(30);
return x + a + b;
} add1(10).then(v => {
console.log(v); // 4 秒后打印 60
}); (async function(x) { // async function expression used as an IIFE
var p_a = resolveAfter2Seconds(20);
var p_b = resolveAfter2Seconds(30);
return x + await p_a + await p_b;
})(10).then(v => {
console.log(v); // 2 秒后打印 60
});

2、异步函数语句

async function name([param[, param[, ... param]]]) { statements }

name:函数名称

function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
} async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result);
// expected output: 'resolved'
} asyncCall();

执行顺序:

(1)异步函数可以包含await指令,该指令会暂停原异步函数的执行,并等待右侧Promise返回结果;

(2)当异步函数暂停时,await右侧调用的函数会继续执行(收到异步函数返回的隐式Promise);


然后上await定义+语法

用于等待右侧表达式的结果(先执行右侧表达式再让出线程阻塞代码,若右侧为同步直接执行,若为异步会等待外部同步代码执行完毕)。它只能在异步函数 async function 中使用。

[return_value] = await expression

Expression:一个 Promise 对象或者任何要等待的值;

return_value:返回 Promise 对象的处理结果;如果等待的不是 Promise 对象,则返回该值本身;

执行顺序:

(1)await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成;

(2)若 Promise 正常处理(Resolved,又称Fulfilled),其回调resolve函数的参数作为 await 表达式的值,继续执行 async function;

(3)若 Promise 处理异常(Rejected),await 表达式会把 Promise 的异常原因抛出;


解决开头的3个疑问:

1、async是干哈的?

定义异步函数(内部通常有异步操作),返回Promise对象(函数返回Promise→显式返回return的Promise;函数返回非Promise→隐式返回Promise.resolve()包装的return值;)

2、await在等啥?

只能放在async函数中,等待右侧表达式结果(函数→结果=return值;字符串→结果=字符串;)

3、await等到了又要干哈?

阻塞后面的代码,先执行async外部的同步代码,同步代码执行完再回到async内部,拿到运算结果(表达式返回Promise→等待Promise对象fulfilled,再将resolve参数作为表达式的运算结果;表达式返回非Promise→直接作为表达式的运算结果;)

参考资料:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference

async与await总结的更多相关文章

  1. [译] C# 5.0 中的 Async 和 Await (整理中...)

    C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...

  2. 探索c#之Async、Await剖析

    阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async.Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下. ...

  3. Async和Await异步编程的原理

    1. 简介 从4.0版本开始.NET引入并行编程库,用户能够通过这个库快捷的开发并行计算和并行任务处理的程序.在4.5版本中.NET又引入了Async和Await两个新的关键字,在语言层面对并行编程给 ...

  4. 异步方法的意义何在,Async和await以及Task的爱恨情仇,还有多线程那一家子。

    前两天刚感受了下泛型接口的in和out,昨天就开始感受神奇的异步方法Async/await,当然顺路也看了眼多线程那几个.其实多线程异步相关的类单个用法和理解都不算困难,但是异步方法Async/awa ...

  5. 多线程之异步编程: 经典和最新的异步编程模型,async与await

    经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...

  6. 浅谈async、await关键字 => 深谈async、await关键字

    前言 之前写过有关异步的文章,对这方面一直比较弱,感觉还是不太理解,于是会花点时间去好好学习这一块,我们由浅入深,文中若有叙述不稳妥之处,还请批评指正. 话题 (1)是不是将方法用async关键字标识 ...

  7. 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]

    看到Microsoft官方一篇关于异步编程的文章,感觉挺好,不敢独享,分享给大家. 原文地址:https://msdn.microsoft.com/zh-cn/library/hh191443.asp ...

  8. 【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单

    一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两 ...

  9. C#基础系列——异步编程初探:async和await

    前言:前面有篇从应用层面上面介绍了下多线程的几种用法,有博友就说到了async, await等新语法.确实,没有异步的多线程是单调的.乏味的,async和await是出现在C#5.0之后,它的出现给了 ...

  10. C# Async与Await的使用

    这个是.NET 4.5的特性,所以要求最低.NET版本为4.5. 看很多朋友还是使用的Thread来使用异步多线程操作,基本上看不见有使用Async.Await进行异步编程的.各有所爱吧,其实都可以. ...

随机推荐

  1. 电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程)

    电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程) 电信NBIOT 2 - 数据上行(中间件获取电信消息通知) 电信NBIOT 3 - 数据下行 电信NBIOT 4 - NB73模块上行测 ...

  2. Ubuntu18.04 Pycharm下ModuleNotFoundError: No module named 'deeplab'

    1.根据https://www.cnblogs.com/zmbreathing/p/deeplab_v3plus.html在终端中成功运行deeplab的test文件后,在pycharm中出现问题: ...

  3. Linux shell awk逻辑控制语句

    awk逻辑控制语句 1,if...else 格式: if(条件){语句:语句} else {语句1:语句2} 如果statement只有一条语句,{}可以不写 以冒号为分隔符,判断第一个字段,如果为r ...

  4. 树莓派初入门(1):SSH远程登录与VNC远程桌面

    前言: 本文主要讲解,对于一个无树莓派显示屏,无键盘,无鼠标,手边只有手机,电脑和一个已烧录好raspbian-stretch系统的树莓派3B+的玩家,如何进行远程登录,进而可以进程桌面的连接. 工具 ...

  5. 豆瓣读书isbn 查询

    最近学习微信小程序,做一个类似"书库"的小demo,大致流程使用摄像头获取书本后面的isbn,通过豆瓣读书API得到书本介绍.豆瓣评分.图书评论等信息,然鹅https://api. ...

  6. Python实现十大经典排序算法(史上最简单)。

    十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...

  7. macOS Catalina 的zsh升级

    MacOS最近做了一个大版本升级,这次升级中对开发者有个很大的更新是,模式的shell变成了zsh,官方提供了升级配置文档:https://support.apple.com/zh-cn/HT2080 ...

  8. emacs第一天

    emacsbinw64.sourceforge.net  windows的emacs下载地方(绿色软件) 学习快速入门 C-h t 快速入门的帮助文档  C-h 是prefix key 光标移动快捷键 ...

  9. Pandas | 27 注意事项&窍门

    警告和疑难意味着一个看不见的问题.在使用Pandas过程中,需要特别注意的地方. 与Pandas一起使用If/Truth语句 当尝试将某些东西转换成布尔值时,Pandas遵循了一个错误的惯例. 这种情 ...

  10. Codeforces Round #603 (Div. 2) E - Editor(线段树,括号序列)