async和await

Posted MaNqo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了async和await相关的知识,希望对你有一定的参考价值。

ES8新特性

async和await

async和await两种语法结合可以让异步代码像同步代码一样

a. mdn文档:

  • https: //developer.mozilla.org/zh-CN/docs/Web/javascript/Reference/Statements/async_function
  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/await

1. async函数

  • 函数的返回值为promise对象

  • promise对象的结果由async函数执行的返回值决定

await

  • 表达式:一个Promise对象或者任何要等待的值
  • 返回值:返回Promise对象的处理结果,如果等待的不是Promise对象,则返回该值本身
[return_value] = await expression

2. await表达式

  • await右侧的表达式一般为promise对象, 但也可以是其它的值

  • 如果表达式是promise对象, await返回的是promise成功的值

  • 如果表达式是其它值, 直接将此值作为await的返回值

    注意:

    • await必须写在async函数中, 但async函数中可以没有await
    • 如果await的promise失败了, 就会抛出异常, 需要通过try…catch来捕获处理
    function fn2() {
        return Promise.reject(2)
    }
    async function test() {
        /* let result = fn2().then(value => {
                 console.log('value',value)
             },
             reason => {
                 console.log('reason',reason)
             });*/
        try {
            let result = await fn2();
            console.log('result', result)
        } catch (error) {
            console.log('error', error)
        }
    }
    test()
    // await右侧表达为promise,得到的结果就是promise成功的值
    // await只想得到成功的结果,所有用try...catch...
    // await右侧表达不为promise,得到的结果就是它本身
    
// async 函数
async function fn() {
    // 返回一个字符串
    // return 'shangguigu';
    // 返回的对象不是一个Promise对象,则返回一个成功的promise
    W
    // 抛出错误
    // throw new Error('wrong');
    
    // 返回的结果是一个promise对象
    return new Promise((resolve, reject) => {
        reject('失败');
    })
}
const result = fn();
console.log(result);
// 创建promise对象
const p = new Promise((resolve, reject) => {
    // resolve('success');
    reject("wrong");
})
// await 要放在async函数中
async function main() {
    try {
        let result = await p;
        console.log(result);
    } catch (e) {
        console.log(e);
    }
}
main();

3. async和await结合读取文件

  • 发送ajax请求

    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);
                    }
                }
            }
        })
    }
    
    • 发送AJAX请求
async function main() {
    await sendAJAX("http://api.apiopen.top/getJoke");
    // 返回结果是promise
}
main();

以上是关于async和await的主要内容,如果未能解决你的问题,请参考以下文章

promise与async和await的区别

async和await用法

Async/Await替代Promise的理由

如何优雅处理 async await 错误——解读小而美的 awaitjs 库

Async/Await是这样简化JavaScript代码的

C# 使用Awaiter