前端学习:ES8中async和await

概述:

async 和 await 两种语法结合可以让异步代码看起来像同步代码一样;
简化异步函数的写法;

1.async函数

概述:
1. async 函数的返回值为 promise 对象;
2. promise 对象的结果由 async 函数执行的返回值决定;

// async函数:异步函数
async function fn(){
// return 123; // 返回普通数据
// 若报错,则返回的Promise对象也是错误的
// throw new Error("出错啦!");
// 若返回的是Promise对象,那么返回的结果就是Promise对象的结果
return new Promise((resolve,reject)=>{
// resolve("成功啦!");
reject("失败啦!");
})
}
const result = fn();
// console.log(result); // 返回的结果是一个Promise对象
// 调用then方法
result.then(value => {
console.log(value);
},reason => {
console.warn(reason);
});

2.await函数

概述:
1. await 必须写在 async 函数中;
2. await 右侧的表达式一般为 promise 对象;
3. await 返回的是 promise 成功的值;
4. await 的 promise 失败了, 就会抛出异常, 需要通过 try...catch 捕获处理

注意:await 必须写在 async 函数中,但是async可以没有await

// 创建promise对象
        const p = new Promise((resolve, reject) => {
            resolve("成功的值");
        })

        // await 要放在async函数中
        async function main() {
            let result = await p;
            console.log(result);
        }

        // 调用函数
        main();

由上述代码运行的结果可以看出,await运行的结果就是promise成功的值。

 // 创建promise对象
        const p = new Promise((resolve, reject) => {
            // resolve("成功的值");
            reject("失败了");
        })

        // await 要放在async函数中
        async function main() {
            try {
                let result = await p;
                console.log(result);
            } catch (e) {
                console.log(e);
            }
        }

        // 调用函数
        main();

从上述代码可以看出,promise失败了需要通过try...catch进行捕获。

3.async与await结合读取文件

// 引入fa模块
const fs = require("fs");

// 读取【为学】
function readWeiXue() {
    return new Promise((resolve, reject) => {
        fs.readFile("../resources/为学.md", (err, data) => {
            // 如果失败
            if (err) reject(err);
            // 如果成功
            resolve(data);
        })
    })
}

// 读取【插秧诗】
function readChaYang() {
    return new Promise((resolve, reject) => {
        fs.readFile("../resources/插秧诗.md", (err, data) => {
            // 如果失败
            if (err) reject(err);
            // 如果成功
            resolve(data);
        })
    })
}

// 读取【观书有感】
function readGuanShu() {
    return new Promise((resolve, reject) => {
        fs.readFile("../resources/观书有感.md", (err, data) => {
            // 如果失败
            if (err) reject(err);
            // 如果成功
            resolve(data);
        })
    })
}

// 声明一个async函数
async function main() {
    // 获取为学内容
    let weixue = await readWeiXue();
    // 获取插秧诗内容
    let chayangshi = await readChaYang();
    // 获取观书有感内容
    let guanshu = await readGuanShu();

    console.log(weixue.toString());
    console.log(chayangshi.toString());
    console.log(guanshu.toString());
}

main();

4.async与await封装AJAX请求

// 发送ajax请求,返回的结果是一个promise对象
        function sendAJAX(url) {

            return new Promise((resolve, reject) => {
                // 1.创建对象
                const x = new XMLHttpRequest();

                // 2.初始化
                x.open("GET", url);

                // 3.发送
                x.send();

                // 4.事件绑定
                x.onreadystatechange = function () {
                    if (x.readyState === 4) {
                        if (x.status >= 200 && x.status < 300) {
                            // 成功啦
                            resolve(x.response);
                        } else {
                            //如果失败
                            reject(x.status);
                        }
                    }
                }
            })

        }


        // promise then 方法测试
        // sendAJAX("https://api.apiopen.top/getJoke").then(value => {
        //     console.log(value);
        // }, reason => { });

        // async 与await 测试
        async function main() {
            // 发送AJAX请求
            let result = await sendAJAX("https://api.apiopen.top/getJoke");
            console.log(result);
        }

        main();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值