JS中的async/await

这次给大家带来js中的async/await,使用js中的async/await的注意事项有哪些,下面就是实战案例,一起来看一下。

JS中的异步操作从最初的回调函数演进到Promise,再到Generator,都是逐步的改进,而async函数的出现仿佛看到了异步方案的终点,用同步的方式写异步。

简单解释async函数就是Generator函数的语法糖。

Generator函数写法

let promise = function (val){    return new Promise(function (resolve, reject){        setTimeout(()=>{            console.log(val);            resolve(val);        },1000);    });};let gen = function* (){    let p1 = yield promise('1');    let p2 = yield promise('2');};let genF = gen();

登录后复制

async函数写法

let promise = function (val){    return new Promise(function (resolve, reject){        setTimeout(()=>{            console.log(val);            resolve(val);        },1000);    });};let gen = async function (){    let p1 = await promise('1');    let p2 = await promise('2');};

登录后复制

async函数是在Generator函数上进行的改进,语法上Generator函数的星号换成了async,yield换成了await。
而async也与Generator函数不同:

自带内置执行器,Generator函数需要依靠执行器,而async可以和普通函数一样,只需要一行

相对Generator函数,async和await语义更清楚

适用性强,yield后只能是Thunk函数和Promise对象,而await后可以是Promise对象和原始类型的值(数值、字符串、布尔型等)

async作用

寄予async函数的期望是希望可以帮助我们解决异步操作问题,所以需要搞清楚async函数的返回值是什么。

async function asyncAwait() {    return 'async await';}let a = asyncAwait();console.log(a);

登录后复制

结果输出:

Promise {: "async await"}

登录后复制

可以看出async函数返回的是一个Promise对象,如果函数中return一个直接量,async函数会封装成Promise对象返回,而如果没有返回值时,async函数会返回undefined

Promise {: undefined}

登录后复制

在没有结合await时,async函数会立即执行,返回一个Promise对象。

await等待

await是个运算符,等待的结果是Promise对象或其他值,比如:

function func1() {    return 'async';}async function func2() {    return Promise.resolve('await');}async function asyncAwait() {    let f1 = await func1();    let f2 = await func2();    console.log(f1, f2);}asyncAwait()

登录后复制

结果输出:

async await

await表达式的运算取决于等待的结果,如果它等到的不是一个Promise对象,那运算结果就是它等到的东西,
而如果它等到的是一个Promise对象,它会阻塞后面的代码,等着Promise对象resolve,然后得到resolve的值,作为表达式的运算结果。
async函数调用会封装在Promise中,这也是await需要在async函数中使用的原因。

async/await链式处理

对于多个异步操作中,Promise的then可以解决多层回调问题。

function ajax(t) {    return new Promise(resolve => {        setTimeout(() => resolve(t + 200), t);    });}function step1(t) {    console.log(`step1 in ${t}ms`);    return ajax(t);}function step2(t) {    console.log(`step2 in ${t}ms`);    return ajax(t);}function step3(t) {    console.log(`step3 in ${t}ms`);    return ajax(t);}function submit(){    console.time('submit');    step1(200)        .then(time2 => step2(time2))        .then(time3 => step3(time3))        .then(result => {            console.log(`result is ${result}ms`);            console.timeEnd("submit");        });}

登录后复制

submit();

async函数实现:

function ajax(t) {    return new Promise(resolve => {        setTimeout(() => resolve(t + 200), t);    });}function step1(t) {    console.log(`step1 in ${t}ms`);    return ajax(t);}function step2(t) {    console.log(`step2 in ${t}ms`);    return ajax(t);}function step3(t) {    console.log(`step3 in ${t}ms`);    return ajax(t);}async function submit(){    console.time('submit');    const t1 = 200;    const t2 = await step1(t1);    const t3 = await step2(t2);    const result = await step3(t3);    console.log(`result is ${result}`);    console.timeEnd('submit');}submit();

登录后复制

结果输出:

step1 in 200msstep2 in 400msstep3 in 600msresult is 800submit: 1209.85107421875ms

登录后复制

而如果需求变更,每一步的参数都是之前步骤的结果后,async函数可以写成:

function ajax(t) {    return new Promise(resolve => {        setTimeout(() => resolve(t + 200), t);    });}function step1(t1) {    console.log(`step1 in ${t1}ms`);    return ajax(t1);}function step2(t1, t2) {    console.log(`step2 in ${t1}ms,${t2}ms`);    return ajax(t1 + t2);}function step3(t1, t2, t3) {    console.log(`step3 in ${t1}ms,${t2}ms,${t3}ms`);    return ajax(t1 + t2 + t3);}async function submit(){    console.time('submit');    const t1 = 200;    const t2 = await step1(t1);    const t3 = await step2(t1, t2);    const result = await step3(t1, t2, t3);    console.log(`result is ${result}`);    console.timeEnd('submit');}submit();

登录后复制

结果输出:

step1 in 200msstep2 in 200ms,400msstep3 in 200ms,400ms,800msresult is 1600submit: 2210.47998046875ms

登录后复制

async/await注意点

async用来申明里面包裹的内容可以进行同步的方式执行,await则是进行执行顺序控制,每次执行一个await,阻塞代码执行等待await返回值,然后再执行之后的await。

await后面调用的函数需要返回一个promise。

await只能用在async函数之中,用在普通函数中会报错。

await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在try…catch代码块中。

async/await try/catch写法

async function asyncAwait() {    try {        await promise();    } catch (err) {        console.log(err);    }}// 另一种写法async function asyncAwait() {    await promise().catch(function (err){        console.log(err);    });}

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

React.js的Mixins.js使用详解

React.js中的CSS使用

以上就是JS中的async/await的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2783302.html

(0)
上一篇 2025年3月8日 16:47:43
下一篇 2025年2月26日 02:57:29

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS性能优化技巧实例分享

    脚本应该放在页面元素代码之后 无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成。JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长。浏览器在下载和执行脚本时出现…

    编程技术 2025年3月8日
    200
  • Vue.js中的动态路由实例详解

    在文章使用vue-router完成简单导航功能 中实现的路由导航功能是不能传递参数的,也就是说是静态路由。而能传递参数的路由模式,由于可以传递参数,所以其对应的路由数量是不确定的,故称之为 动态路由。 那么如何将参数作为路由呢? 在参数名前…

    编程技术 2025年3月8日
    200
  • js传递和拷贝详解

    我们知道js有几种基本的数据类型和其他的复杂数据类型包括(对象,数组,函数),基本数据类型的赋值其实就是值的拷贝,我们称之为值传递,赋值后的变量和原来的变量除了值相等之外并无其他关联。 let x = 666let y = xlet m =…

    编程技术 2025年3月8日
    200
  • js如何获取鼠标当前位置实例

    本文主要和大家分享js如何获取鼠标当前位置实例,希望能帮助到大家。         javascript获得鼠标位置鼠标X轴:鼠标Y轴: function mouseMove(ev) { Ev = ev || window.event; v…

    编程技术 2025年3月8日
    200
  • js兼容性问题详解

    本文主要和大家分享js兼容性问题详解, 1.HTML对象获取问题 FireFox:document.getElementById(“idName”); ie:document.idname或者document.getElementById(…

    编程技术 2025年3月8日
    200
  • JS实现粘贴到剪贴板实例代码分享

    本文主要和大家分享JS实现粘贴到剪贴板实例代码,目前常见的实现粘贴到剪贴板主要有以下两种方法,希望能帮助到大家。 第三方库 clipboard 原生js, 主要是 document.execcommand方法 第一种方法按照文档说明,设置触…

    编程技术 2025年3月8日
    200
  • js混入式继承实例详解

    1.运用场景:假设有两个对象o1,o2,如果要把o2的方法和属性拷贝到o1中,混入式继承是最简便的方法之一 2.实现方式:用for…in…的方式遍历o2对象的属性和方法,并将o2的属性和方法赋值给o1 代码实现 function mixEx…

    编程技术 2025年3月8日
    200
  • rxjs的详解

    这次给大家带来rxjs的详解,使用rxjs的注意事项有哪些,下面就是实战案例,一起来看一下。 rxjs(Reactive Extensions for JavaScript)是Javascript的响应式扩展, 响应式的思路是把随时间不断变…

    编程技术 2025年3月8日
    200
  • js进行浏览器的Cookies设置实例

    Cookies现在经常被大家提到,那么到底什么是Cookies,它有什么作用呢?Cookies是数据包,可以让网页具有记忆功能,在某台电脑上记忆一定的信息。Cookies的工作原理是,第一次由服务器端写入到客户端的系统中。以后每次访问这个网…

    编程技术 2025年3月8日
    200
  • 用JS代码做出弹幕效果

    这次给大家带来用js代码做出弹幕效果,用js代码做出弹幕效果的注意事项有哪些,下面就是实战案例,一起来看一下。 实现原理 1、设置展示弹幕元素位置属性为relative2、动态创建弹幕元素,位置属性设置absolute,left为展示宽度3…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论