当前位置: 首页 > article >正文

JS中的aynsc和await

虽然async和await通常会在一起被提到,但是最好把它们分开,作为两个概念,更容易理解些。

况且使用async也不一定要使用await

async,await 是以更舒适的方式使用promise的一种特殊语法,相比promise它使代码更优雅。

ansync function

定义一个异步函数

async function f() {
    return 1;
}

它是异步执行的,它总是返回一个promise,返回的值被自动包装在一个resolved的promise中。它的行为就如同下面的代码

Promise.resolve(1)

异步函数中会返回一个包装后的promise对象,它对返回值的处理与Promisethen方法一样。

如下代码再通过then方法注册回调函数。

async function f() {
    return 1;
}

f().then((r)=>console.log(r));

console.log("==> end");//这个==> end在1之前输出

await关键字

如下语法:

let value = await promise;

关键字await让javascript引擎等待直到promise完成并返回结果。

它只能在async函数内工作。

async function f() {
    let p = new Promise((resolve,reject) => {
        setTimeout(()=>resolve("done!"),1000);
    });

    let r = await p

    console.log(r);
    console.log("===>end");
}

f()

这个函数在执行时,"暂停"在了await那一行,在等待Promise执行完后,才继续执行。可以看到输出结果是

===>end 在 done之后打印。

相比于promise.thenawait只是获取promise的结果的一个更优雅的语法,并且也更易于读写,所以它返回的还是一个包装后的promise对象,当然还可以再调用then,形成链式调用。

async function f() {
    return await new Promise((resolve,reject)=>{
        setTimeout(()=>resolve("done!"),1000);
    });
}

f().then((r)=>{
    console.log(r);
})

上面的代码等待一秒后再输出结果值。

作用

aynsc和await的作用就是简化Promise代码。

看下面的例子,通过Promise实现顺序的网络文件请求。

function ajax(url,sucessCb,failedCb) {
    //1.创建XMLHttpRequest对象
    var xmlHttp = new XMLHttpRequest();
    //2.发送请求
    xmlHttp.open('GET',url,true);
    xmlHttp.send();
    //3.服务端响应
    xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {
            var obj = JSON.parse(xmlHttp.response);
            sucessCb && sucessCb(obj);
        } else if (xmlHttp.readyState === 4 && xmlHttp.status === 404) {
            failedCb && failedCb(xmlHttp.statusText);
        }
    }
}

function getPromise(url) {
    return new Promise((reslove,reject)=> {
        ajax(url,reslove,reject);
    })
}

getPromise('static/a.json').then(res=>{
    console.log(res);
    return getPromise('static/b.json');
}).then(res=>{
    console.log(res);
    return getPromise('static/c.json');
},err=>{
    console.log(err);
    return getPromise('static/d.json');
}).then(res=>{
    console.log(res);
})

通过aynsc和await来简化

async function getData() {
  const res1 = await request('static/a.json');
  console.log(res1);
  const res2 = await request('static/b.json');
  console.log(res2);
  const res3 = await request('static/c.json');
  console.log(res3);
}

参考资料:

https://zh.javascript.info/async-await

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function


http://www.kler.cn/a/469504.html

相关文章:

  • Android Telephony | 协议测试针对 test SIM attach network 的问题解决(3GPP TS 36523-1-i60)
  • Android:动态去掉RecyclerView动画导致时长累加问题解决
  • 【前端下拉框】获取国家国旗
  • nodejs实现https://localhost在window系统自签名99年+授信
  • 【视觉SLAM:六、视觉里程计Ⅰ:特征点法】
  • Gitee图形界面上传(详细步骤)
  • IO编程与正则表达式
  • 保姆级教程Docker部署MySQL镜像
  • 网络安全的主要防护对象有哪些?
  • Oracle删除归档日志
  • Mysql数据实时同步到Es上
  • Harmony tab的使用
  • 2025年大数据、通信技术与计算机应用国际学术会议(BDCTA 2025)
  • GPTs+PRA:教育领域的新引擎,推动个性化与智能化教学
  • 量子机器学习:当量子计算遇上人工智能,颠覆即将来临?
  • Ubuntu20.04版本的ROS环境配置与基本概述
  • 生成式AI与RAG架构:如何选择合适的向量数据库?
  • TLS(传输层安全,Transport Layer Security)是用于在网络上提供通信安全的一种加密协议。
  • 【整理集合大全】MySQL(4) 数据库增删改查SQL语句
  • pytorch 梯度判断函数介绍
  • 【生活】冬天如何选口罩(医用口罩,N95, KN95还是KP95?带不带呼吸阀门?带不带活性炭?)
  • leetcode hot 100 只出现一次的数字
  • uniapp - 基于uniapp+vue3实现自定义增强版table表格组件体验「兼容H5+小程序+App端」
  • DooTask | 使用 DooTask AI 机器人,解锁任务创建新姿势
  • 使用Chrome谷歌浏览器中内置翻译功能
  • DVWA 命令注入写shell记录