es6异步编程解决方案之async(代码片段)

Mr.隐士 Mr.隐士     2022-10-24     679

关键词:

一、async 函数的基本用法

  • async 函数返回一个 Promise 对象,可以使用 thencatch 方法 添加回调函数

  • async 函数执行时,一旦遇到 await 就会先返回,等到异步操作完成,再接着执行函数体内后面的语句 【异步函数 同步执行】

  • async 函数有很多种形式:

// 函数声明
async function foo() 

// 函数表达式
const foo = async function () ;

// 箭头函数
const foo = async () => ;

// Class 的方法
class Storage 
  constructor() 
    this.cachePromise = caches.open(‘avatars‘);
  

  async getAvatar(name) 
    const cache = await this.cachePromise;
    return cache.match(`/avatars/$name.jpg`);
  


// 对象的方法
let obj =  async foo()  ;
obj.foo().then(...)
  • 示例: 指定多少毫秒后输出一个值
function timeout(ms) 
    return new Promise((resolve) => 
        setTimeout(resolve, ms);
    );


async function asyncPrint(value, ms) 
    await timeout(ms);
    console.log(value);


asyncPrint(‘hello world‘, 50);

// 上面代码指定 50 毫秒以后,输出 hello world

二、async 语法

1. async 函数

  • async 函数的返回值 是 Promise 对象 (可调用 thencatch 方法)

  • async 函数内部抛出错误,会导致返回的 Promise 对象变为 reject 状态

  • async 函数的回调方法 thencatch 的参数

    • async 函数内部 return 关键字返回的值,会 作为 thencatch 方法的参数

    • async 函数的返回的 Promise 对象 状态为 resolve 时,函数内部 若没有返回值,thencatch 方法的参数 为 undefined;调用 then 方法

    • async 函数的返回的 Promise 对象 状态为 reject 时,函数内部 若没有返回值,thencatch 方法的参数 为 错误对象;调用 catch 方法

async function f() 
    return await Promise.resolve(123);


f().then(v => console.log(v));  // 123
async function f() 
    await Promise.resolve(123);


f().then(v => console.log(v));  // undefined
async function f() 
  throw new Error(‘出错了‘);


f().then(
  v => console.log(v),
  e => console.log(e)   
)   // Error: 出错了

2. await 关键字

  • await 关键字 只能在 async 函数中使用: await 后面 如果跟异步函数,程序执行时会等 await 后面的 异步函数执行完之后,再执行 后面的代码 【异步函数 同步执行】

  • 正常情况下,await 命令后面是一个 Promise 对象;如果不是,会转成 Promise 对象,并立即 resolve

// 只要有一个 `await` 后面的函数执行错误,程序就会停止执行代码

async function f() 
    await Promise.reject(‘出错了‘);
    await Promise.resolve(‘hello world‘); // 不会执行

    
f().then(
    (result) => 
        console.log(result);
    ,
    (e) => 
        console.log(e);     
    
);      // 出错了

三、async 应用

1. 一个 async 函数中,有多个 await 关键字:使用 try..catch( ) 避免程序终止

  • 场景: 只要有一个 await 后面的函数执行错误,程序就会停止执行代码; async 函数返回的 Promise 对象的状态为 reject

  • 解决方案:
    • 方案 1:使用 try...catch() 把有可能出错的 操作放到 try 语句中

    • 方案 2:await 后面的 Promise 对象再跟一个 catch 方法,处理前面可能出现的错误

// 解决方案 1:try...catch() 即使有一个异步操作失败,也不终止程序

async function f() 
    try 
        await Promise.reject(‘出错了‘);
     catch(e) 
        console.log(e);
    
    
    return await Promise.resolve(‘hello world‘);


f().then(v => console.log(v))
// hello world
// 解决方案 2:catch() 即使有一个异步操作失败,也不终止程序

async function f() 
    await Promise.reject(‘出错了‘)
        .catch(e => console.log(e));
    return await Promise.resolve(‘hello world‘);


f().then(v => console.log(v))
// 出错了
// hello world

2. 一个 async 函数中,有多个 await 关键字:使 await 后面的异步操作 同时执行

// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);

// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;

3. 使用 try...catch() 结合 asyncawait 实现 ajax 请求轮询

const NUM_RETRIES = 3;

async function ajaxRequest() 
    for (let i = 0; i < NUM_RETRIES; ++i) 
        try 
            await $.get(‘http://google.com/this-throws-an-error‘);
            break;
         catch(err) 
            console.log(err);
        
    


ajaxRequest();

四、async for await...of ---> 异步遍历

  • 遍历时,有一个异步请求报错,都会导致程序终止;所以,结合 try...catch() 解决此类问题
async function () 
    try 
        for await (const x of createRejectingIterable()) 
            console.log(x);
        
    
    catch (e) 
        console.error(e);
    

五、async 与 其他异步解决方案的 比较

  • Promise: 比回调函数的写法大大改进,但是一眼看上去,代码完全都是 Promise 的 API(then、catch等等),操作本身的语义反而不容易看出来

  • Generator: 语义比 Promise 写法更清晰,需要有 任务运行器,自动执行 Generator 函数;但偏底层的写法

  • async: Generator 函数的语法糖,封装了 Generator 的底层机制 ,实现最简洁,最符合语义;

es6——异步操作之promise(代码片段)

基本概念:  Promise:是ES6中新增的异步编程解决方案,提现在代码中他是一个对象可以通过Promise构造函数来实例化。  -newPromise(cb)===>实例的基本使用,PendingResolvedRejected >两个原型方法:  -Promise.prototype.then()-Prom... 查看详情

es6之async函数(代码片段)

1.简介ES2017引入了async函数,使得异步操作变得更加方便。async函数的返回值是Promise对象,因此可以使用.then()方法指定下一步操作。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体后面的语... 查看详情

async函数(代码片段)

一、概念①async函数是ES6里增加的函数,使得异步操作变得更加简单②在async函数内部使用await的方式来操作异步API,awit是一种新的语法,只能在asysc函数中使用,await一般是在其后跟一个promise操作API③参考之前的文章:异步编程... 查看详情

async+await处理异步问题(代码片段)

在编写网页的时候我们常常会遇到异步问题,async+await是es6提出的解决异步的方法,下面我们来看看这个方法怎么实现解决异步的,大家都知道,setTimeout是一个定时器。他是一个异步执行的语句。如:functionfoo()setTimeout(()=>conso... 查看详情

javascript系列之es6篇(代码片段)

...(1)含义:promise是ES6引出的新的异步编程的解决方案,语法上promise是一个构造函数,用来封装异步操作并且可以获取其成功或失败的结果。2,简单的promise用例constp=newPromise(function(res 查看详情

es6async/await完爆promise的6个原因(代码片段)

...数就是隧道尽头的亮光,很多人认为它是异步操作的终极解决方案。Async/await语法试想一下,我们有一个getJSON方法,该方法发送一个异步请求JSON数据,并返回一个promise对象。这个promise对象的resolve方法 查看详情

异步编程的终极解决方案async/await:用同步的方式去写异步代码(代码片段)

早期的回调函数回调函数我们经常有写到,比如:ajax(url, (res) =>   console.log(res);)但是这种回调函数有一个大缺陷,就是会写出回调地狱(Callbackhell)。比如,如果多个回调存在依赖,可能会写... 查看详情

es6之generator(代码片段)

Generator函数是ES6提供的一种异步编程解决方案.执行Generator函数会返回一个遍历器对象Generator函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的... 查看详情

初识async函数(代码片段)

...先从大的方面来说,出现async函数时为了解决JS编程中的异步操作,再往具体说就是为了对以往异步编程方法的一种改进,也有人说仅仅只是Generator函数的语法糖,这个我暂时还没理解到那个程度,因为我对Generator还是一知半解... 查看详情

es6之promise简单理解及使用(代码片段)

promise1.promise是解决异步的一种方案,也就是让promise帮我们去处理异步,最终promise会返回异步处理的结果。2.有了promise之后,让异步处理更加灵活,还能够解决之前的回调地狱的问题。promise的使用我们需要用promise帮我们处理异... 查看详情

async:简洁优雅的异步之道(代码片段)

前言在异步处理方案中,目前最为简洁优雅的便是async函数(以下简称A函数)。经过必要的分块包装后,A函数能使多个相关的异步操作如同同步操作一样聚合起来,使其相互间的关系更为清晰、过程更为简洁、调试更为方便。... 查看详情

flutter之异步操作async原理future本质(代码片段)

...一种让Dart代码运行在其他线程的方式)、事件循环和异步编程。除非你自己创建一个 Isolate ,否则你的Dart代码永远运行在UI线程 查看详情

flutter之异步操作async原理future本质(代码片段)

...一种让Dart代码运行在其他线程的方式)、事件循环和异步编程。除非你自己创建一个 Isolate ,否则你的Dart代码永远运行在UI线程 查看详情

异步编程解决方案之事件发布/订阅模式(代码片段)

时间监听模式是广泛用于异步编程的模式,是回调函数的事件化,又称不发订阅模式。nodejs的events模块就是发布订阅模式的一个简单实现,不存在preventDefault,stopPropagation,stopImmediatePropagation,等控制事件传递的方法。它具有addListner... 查看详情

javascript的es6中async&&await的简单使用以及介绍(代码片段)

...or的语法糖,使用他的目的就是用同步的写法,写异步的操作,去解决回调地狱async是“异步”的简写,async用于申明一个异步的functionawait可以认为是asyncwait的简写,await用于等待一个异步方法执行完成。一、as... 查看详情

异步编程解决方案之promise/deferred(代码片段)

Promise三种状态:未完成、完成态、失败态varevents=require(‘events‘);varutil=require(‘util‘);varEventEmitter=events.EventEmitter;varPromise=function()EventEmitter.call(this);util.inherits(Promise,EventEmitter);Promis 查看详情

es6知识点整理之----async----语法(代码片段)

1、async函数返回一个Promise对象。2、async函数内部return语句返回的值,会成为then方法回调函数的参数。asyncfunctionf()return‘helloworld‘;f().then(v=>console.log(v))//"helloworld"3、async函数内部抛出错误,会导致返回的Promise对象变为reject状... 查看详情

关于es7里面的async和await(代码片段)

...ait是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案。目前,async/await这个特性已经是stage3的建议,可以看看TC39的进度,本篇文章将分享async/await是如何工作的,阅读本文前,希望你具备Promise、generator、yield等ES6的... 查看详情