async/await

  1. 它保证函数的返回值为 promise。
  2. 用更少的.then()块来封装代码,同时它看起来很像同步代码

注意:可能会因为大量await的promises相继发生而变慢。

async关键字

使用 async 关键字,把它放在函数声明之前,使其成为 async function。

let hello = async function() {
return "Hello"
};
//let hello = async () => { return "Hello" };
hello(); //Promise { <state>: "fulfilled", <value>: "Hello" }

await关键字

await 只在异步函数里面才起作用。

promise & async/await

//promise
fetch('coffee.jpg').then(response => response.blob())
.then(myBlob => {
let image = document.createElement('img');
image.src = URL.createObjectURL(myBlob);
document.body.appendChild(image);
}).catch(e => {
console.log('an error with fetch img: ' + e.message);
});
//async/await
async function fetchImg(){
try{
let myFetch = await fetch('coffee.jpg');
let myBlob = await myFetch.blob();
let image = document.createElement('img');
image.src = URL.createObjectURL(myBlob);
document.body.appendChild(image);
}catch(e){
console.log('an error with fetch img: ' + e);
}
}
//promise + async/await
(async function fetchImg(){
let myFetch = await fetch('coffee.jpg');
return await myFetch.blob();
})().then(blob=>{
let image = document.createElement('img');
image.src = URL.createObjectURL(myBlob);
document.body.appendChild(image);
}).catch(e => {
console.log('an error with fetch img: ' + e.message);
});

async/await 的缺点

await 关键字会阻塞其后的代码,直到promise完成,就像执行同步操作一样。

这意味着您的代码可能会因为大量awaitpromises相继发生而变慢。每个await都会等待前一个完成,而你实际想要的是所有的这些promises同时开始处理(就像我们没有使用async/await时那样)。

有一种模式可以缓解这个问题——通过将 Promise 对象存储在变量中来同时开始它们,然后等待它们全部执行完毕。

function timeoutPromise(time) {
return new Promise((resolve, reject) => {
setTimeout(()=>{
resolve("done");
}, time);
});
}; let startTime = Date.now();
timeTest().then(() => {
let timeTaken = Date.now() - startTime;
alert("Time taken in milliseconds: " + timeTaken);
}) //slow:大约是9s
async function timeTest() {
await timeoutPromise(3000);
await timeoutPromise(3000);
await timeoutPromise(3000);
}
//fast:大约是3s
async function timeTest() {
const timeoutPromise1 = timeoutPromise(3000),timeoutPromise2 = timeoutPromise(3000),timeoutPromise3 = timeoutPromise(3000);
await timeoutPromise1;
await timeoutPromise2;
await timeoutPromise3;
}
//or:大约是3s
await Promise.all([timeoutPromise(3000),timeoutPromise(3000),timeoutPromise(3000)]);

旧式异步回调的缺点

  • 嵌套回调可能很麻烦且难以阅读(即“回调地狱”)
  • 每层嵌套都需要故障回调,而使用promises,您只需使用一个.catch()代码块来处理整个链的错误。
  • 异步回调不是很优雅。
  • Promise回调总是按照它们放在事件队列中的严格顺序调用;异步回调不是。
  • 当传入到一个第三方库时,异步回调对函数如何执行失去完全控制。

JS学习-async/await的更多相关文章

  1. JavaScript基础——深入学习async/await

    本文由云+社区发表 本篇文章,小编将和大家一起学习异步编程的未来--async/await,它会打破你对上篇文章Promise的认知,竟然异步代码还能这么写! 但是别太得意,你需要深入理解Promis ...

  2. 初步学习async/await,Task.GetAwaiter,Task.Result

    网上关于async/await的知识有很多,看了很多但不如自己实践一遍来得快,所以这里记录下我的理解和大家学习下. 首先以最简单的同步方法来开始如下 private static void Test( ...

  3. 七 vue学习 async/await

    1:  javaScript async/await: 调用async函数的时候,是异步的,函数后面的代码继续执行.! async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解 ...

  4. C# 学习async/await(个人理解)

    await : 等待的意思 async:异步(非同步) 当我们方法内部   存在await的时候,就返回出去 执行下一步 ,等await后面的方法执行完毕 在执行await下面的方法 一.我们先看正常 ...

  5. js学习笔记 -- await/ async

    await 暂停async function函数,等待Promise处理完成,若Promise 状态为fulfilled,其回调resolve的参数作为await的值,Promise 状态为rejec ...

  6. 理解 js的 async/await

    async 和await 在干什么? async  用于声明一个function是异步的 await用于等待一个异步方法执行完成(其实我理解的是等待的是一个表达式,就是一个结果), 其中  await ...

  7. 小程序如何支持使用 async/await

    下载 regenerator-runtime npm i regenerator-runtime 如何使用 在小程序中,不认识 node_modules 文件夹,无法通过以下方法来直接找到包文件 im ...

  8. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  9. 【学习笔记】JS经典异步操作,从闭包到async/await

    参考文献:王仕军——知乎专栏前端周刊 感谢作者的热心总结,本文在理解的基础上,根据自己能力水平作了一点小小的修改,在加深自己印象的同时也希望能和各位共同进步... 1. 异步与for循环 抛出一个问题 ...

  10. js异步回调Async/Await与Promise区别 新学习使用Async/Await

    Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...

随机推荐

  1. wget 和 curl的区别

    原文 https://www.codenong.com/s1190000022301195/ https://geek-docs.com/linux/linux-ask-answer/differen ...

  2. 关于head中代码被挤到body中的问题

    可能是使用php引用文件时出现了问题,文件格式不是utf-8,将其放在head后面就好

  3. 音乐下载器,音乐解析软件,全网音乐免费下载,mp3格式音乐下载,flac格式音乐下载,无损音质音乐下载器,你想听的都搜的到~

    在这个音乐版权被三分天下的时代,想必大家也都会有这种的困扰,喜欢的音乐很多,刚好这些音乐的版权还分散在三大主流音乐厂商的手里. 这样的话,想要听或者下载自己喜欢的音乐可能要开多个会员,而且下载的音乐单 ...

  4. docker容器部署flask单页面应用

    本地安装docker,拉取centos镜像. docker pull centos:7 本地文件结构: /usr/local/var/tmp/docker_demo .app ---requireme ...

  5. Spring基本概述

    Spring是一个开源框架,官方网站是http://spring.io/,Spring是2003年兴起的一个轻量级的Java开发框架,由lnterface21公司的JavaEE专家RodJohnson ...

  6. FRP 反向代理渗透

    前言 之前在一个项目中遇到了一个渗透环境,只能使用工具代理远程访问内网,于是便接触了FRP这款内网穿透工具,通过内网反向代理进行远程渗透测试.这篇文章就简单介绍如何实现FRP反向代理渗透,作为个人笔记 ...

  7. python读取word文档,插入mysql数据库实例

    表格内容如下: 1.实现批量导入word文档,取文档标题中的数字作为编号 2.除取上面打钩的内容需要匹配出来入库入库,其他内容全部直接入库mysql # wuyanfeng# -*- coding:u ...

  8. VM虚拟机15安装Kali Linux2020版详细教程

    下载kali镜像 kali Linux官网地址https://www.kali.org/downloads/下载相对应的电脑版本 打开Vmware虚拟机 安装虚拟机看物理机配置,尽量不要太折腾电脑(虚 ...

  9. 【快问快答】为什么NPOI读取表格数据的时候,遇到空格单元值会直接忽略

    答:其实就是Excel文档的问题,具体问题出在哪里不知道,反正尝试换了一份新的文档来进行导入就可以!

  10. python调用包中函数__init__作用

    python调用包中函数__init__作用 lx:分享一个小知识点 lx:主函数中 调用了 包(目录)中某个模块的函数,但是没有出现模块名.函数铭 lx:可能是再包中的__init__中已经提前调用 ...