async/await 的理解和用法

async/await是什么

async/await 是ES2017(ES8)提出的基于Promise的解决异步的最终方案。

async

async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。

// async基础语法
async function fun0(){
    console.log(1);
    return 1;
}
fun0().then(val=>{
    console.log(val) // 1,1
})

async function fun1(){
    console.log('Promise');
    return new Promise(function(resolve,reject){
        resolve('Promise')
    })
}
fun1().then(val => {
    console.log(val); // Promise Promise
})
await

await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待

await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行;

如果不是Promise对象:把这个非promise的东西当做await表达式的结果。

async function fun(){
    let a = await 1;
    let b = await new Promise((resolve,reject)=>{
        setTimeout(function(){
            resolve('setTimeout')
        },3000)
    })
    let c = await function(){
        return 'function'
    }()
    console.log(a,b,c)
}
fun(); // 3秒后输出: 1 "setTimeout" "function"
function log(time){
    setTimeout(function(){
        console.log(time);
        return 1;
    },time)
}
async function fun(){
    let a = await log(1000);
    let b = await log(3000);
    let c = log(2000);
    console.log(a);
    console.log(1)
}
fun(); 
// 立即输出 undefined 1
// 1秒后输出 1000
// 2秒后输出 2000
// 3秒后输出 3000
async/await 的正确用法
// 使用async/await获取成功的结果

// 定义一个异步函数,3秒后才能获取到值(类似操作数据库)
function getSomeThing(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve('获取成功')
        },3000)
    })
}

async function test(){
    let a = await getSomeThing();
    console.log(a)
}
test(); // 3秒后输出:获取成功
  • 234
    点赞
  • 1077
    收藏
    觉得还不错? 一键收藏
  • 39
    评论
async/awaitJavaScript 中处理异步操作的一种语法糖,它建立在 Promise 的基础上,使异步代码更加简洁、易读和易于理解。 使用 async/await,可以将异步操作的代码看起来像是同步的,避免了回调函数和 Promise 链的嵌套,使代码逻辑更加清晰。 async/await 的关键点如下: 1. async 函数:通过在函数前面加上 `async` 关键字,将函数标记为一个异步函数。异步函数会返回一个 Promise 对象。 2. await 表达式:在异步函数内部,可以使用 `await` 关键字来暂停异步操作的执行,等待 Promise 对象的状态变为 Fulfilled,并返回 Promise 对象的结果。在等待期间,async 函数会暂停执行,直到 Promise 对象的状态变为 Fulfilled 或 Rejected。 3. 错误处理:使用 try/catch 块来捕获异步操作中可能发生的错误。在 async 函数中,可以使用 try/catch 块来捕获 await 表达式中的错误,并进行相应的处理。 以下是一个使用 async/await 的示例代码: ```javascript function fetchData() { return new Promise(function(resolve, reject) { // 模拟异步操作 setTimeout(function() { const data = 'Hello, world!'; // resolve(data); // 异步操作成功,调用 resolve 方法并传递结果 reject('Error'); // 异步操作失败,调用 reject 方法并传递错误原因 }, 1000); }); } async function getData() { try { const data = await fetchData(); // 等待异步操作的结果 console.log(data); const upperData = data.toUpperCase(); console.log(upperData); } catch (error) { console.error(error); } finally { console.log('Async/await finished'); } } getData(); ``` 在这个示例中,`fetchData()` 函数返回一个 Promise 对象,模拟了一个异步操作。在 `getData()` 函数中,使用 `await` 关键字等待异步操作的结果,并将结果赋值给 `data` 变量。如果异步操作成功,就继续执行后面的代码;如果异步操作失败,则抛出一个错误,并执行 catch 块中的代码。最后,不论 Promise 对象的状态如何,都会执行 finally 块中的代码。 通过使用 async/await,可以以更简洁和直观的方式编写异步代码,并且能够更好地处理异步操作的结果和错误。它提供了一种更优雅和易读的方式来处理异步操作,使代码逻辑更加清晰和易于维护。
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值