关于async函数中await的执行分析

本文探讨了async函数中await关键字的行为,特别是它如何等待Promise变为resolve状态才继续执行。当await后的Promise未处理resolve状态时,程序会等待。在错误处理方面,如果Promise有catch,不影响后续执行;若无错误处理,会抛出错误,并可能由上层catch捕获。根据jQuery的promise机制,await的错误处理遵循类似catch的规则,寻找合适的错误处理函数。

关于async函数中await的执行分析

     async函数中await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象。那么await是否等待这个Promise置为resolve状态才能进行下一步运行呢?我们通过下面代码分析下

async function test(){
        await new Promise(function(resolve,reject){
            setTimeout(x=>resolve('11111'),2000);
        }).then(x=>console.log(x));
        await new Promise(function(resolve,reject){
            setTimeout(x=>resolve('22222'),2000);
        }).then(x=>console.log(x));
    }
    test()
    //11111  2秒后打印
    //22222  4秒后打印

    分析得出await是在Promise的resolve状态下才进行下一步。
    如果没有处理resolve状态呢?

 async function test(){
        await new Promise(function(resolve,reject){
            //setTimeout(x=>resolve('11111'),2000);
        });
        await new Promise(function(resolve,reject){
            setTimeout(x=>resolve('22222'),2000);
        }).then(x=>console.log(x));
    }
//测试发现并没有任何打印

所以await需要Promise的resolve状态。
那么reject状态又是如何呢?

async function test(){
        await new Promise(function(resolve,reject){
            setTimeout(x=>reject('11111'),2000);
        }).catch(x=>console.log(x));
        await new Promise(function(resolve,reject){
            setTimeout(x=>resolve('22222'),2000);
        }).then(x=>console.log(x));
    }
     //11111  2秒后打印
    //22222  4秒后打印
async function test(){
        await new Promise(function(resolve,reject){
            setTimeout(x=>reject('11111'),2000);
        });
        await new Promise(function(resolve,reject){
            setTimeout(x=>resolve('22222'),2000);
        }).then(x=>console.log(x));
    }
    //报错
async function test(){
        await new Promise(function(resolve,reject){
            setTimeout(x=>reject('11111'),2000);
        });
        await new Promise(function(resolve,reject){
            setTimeout(x=>resolve('22222'),2000);
        }).then(x=>console.log(x));
    }
    test().catch(x=>console.log(x));
    //11111   2秒后打印

分析得出:
1.如果await后面的promise拥有catch则不影响后续的执行
2.如果没有处理错误状态则会报错,如果test有错误处理则错误抛出给test的catch处理。
3.根据jQuery的promise机制分析猜测await的错误处理流程:如果await后面的Promise拥有错误处理函数,则将该函数放入错误处理队列,待抛出错误将处理函数和参数apply方法使用一下,如果没有错误处理函数,则从父级中查找错误处理函数放入队列,如果没有,再从上一级直到找到错误处理函数放入队列(这跟promise的catch用法符合),如果没有则报错。

### JavaScript中async函数await关键字的使用方法 在JavaScript中,`async`函数和`await`关键字提供了一种更简洁、直观的方式来处理异步操作,而无需依赖复杂的Promise链式调用。以下是关于如何正确使用`async`函数和`await`关键字的详细说明: #### 1. 声明`async`函数 `async`函数通过`async`关键字声明。这种函数是`AsyncFunction`构造函数的实例,并且允许在其内部使用`await`关键字。无论函数内部是否显式返回一个`Promise`对象,`async`函数总是会返回一个`Promise`对象[^2]。 ```javascript async function myAsyncFunction() { return "Hello, world!"; } myAsyncFunction().then(result => console.log(result)); // 输出: Hello, world! ``` #### 2. 使用`await`等待`Promise` `await`关键字用于等待一个`Promise`的结果,只能在`async`函数内部使用。当遇到`await`时,函数执行会被暂停,直到`Promise`被解决(resolved)或拒绝(rejected)。如果`Promise`被解决,则`await`表达式的值为解决的值;如果`Promise`被拒绝,则需要捕获错误[^3]。 ```javascript async function fetchData() { try { const result = await Promise.resolve("Data fetched successfully!"); console.log(result); // 输出: Data fetched successfully! } catch (error) { console.error(error); } } fetchData(); ``` #### 3. 错误处理 如果`await`后面的`Promise`被拒绝,错误可以通过`try...catch`语句捕获。如果没有使用`try...catch`,则需要在调用`async`函数时使用`.catch()`方法来处理错误[^4]。 ```javascript async function handleError() { try { const res1 = await Promise.reject("An error occurred!"); console.log(res1); } catch (error) { console.error(error); // 输出: An error occurred! } } handleError(); ``` 或者在外层捕获错误: ```javascript async function throwError() { const res1 = await Promise.reject("An error occurred!"); console.log(res1); } throwError().catch(err => console.error(err)); // 输出: An error occurred! ``` #### 4. 多个异步操作的顺序执行 可以使用多个`await`来按顺序执行多个异步操作。每个`await`都会暂停当前`async`函数执行,直到对应的`Promise`完成。 ```javascript async function sequentialPromises() { const result1 = await Promise.resolve("First"); console.log(result1); // 输出: First const result2 = await Promise.resolve("Second"); console.log(result2); // 输出: Second } sequentialPromises(); ``` #### 5. 并行执行多个异步操作 如果需要并行执行多个异步操作,可以将这些操作存储在变量中,然后使用`Promise.all()`等待所有操作完成。 ```javascript async function parallelPromises() { const promise1 = Promise.resolve("First"); const promise2 = Promise.resolve("Second"); const [result1, result2] = await Promise.all([promise1, promise2]); console.log(result1, result2); // 输出: First Second } parallelPromises(); ``` --- ### 注意事项 - `await`只能在`async`函数内部使用,否则会导致语法错误。 - 如果`async`函数内部抛出未捕获的错误,该错误会被包装成一个被拒绝的`Promise`[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值