async、await优雅的解决异步调用

在项目中,会有很多情况是需要请求多个接口并存在依赖情况,有的是下一个请求要使用上一个请求的结果,需要串行。有的是要某几个执行完再执行别的操作,需要并行。下面以定时器模拟请求接口,总结几种将异步转为同步方法:

let num1 = 1;
let num2 = 2;
// get1请求、get2请求
function get1 () {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            num1 += 1
            console.log('get1要2s执行')
            resolve(num1)
        }, 2000)
    })
}
function get2 () {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            num2 += 2
            console.log('get2要1s执行')
            resolve(num2)
        }, 1000)
    })
}
1、异步请求,不存在依赖关系
get1()
get2()
console.log('aaa')
// aaa
// get2要1s执行
// get1要2s执行

此时get1和get2会按顺序依次执行,虽然get1先执行,但是get1延迟了2s,get2只有1s,所以会先执行完get2。在实际项目中并不能确认他俩谁先返回结果,具体要看当时的网络和接口情况。

2、两个请求都要执行完(不需要谁先谁后)才进行下一步操作:Promise.all()
Promise.all([get1(), get2()])
    .then((response) => {
		console.log(response)
	})
	.catch(err => {
         console.log(err)
	})
// get2要1s执行
// get1要2s执行
// [2, 4]
then的函数体会在get1和get2的回调完成后执行,参数response是get1和get2的resolve()参数值组成的数组
3、两个请求要按照先后顺序执行完才进行下一步操作:await
async function get3(){
	await get1()
	await get2()
	console.log('11111')
}
get3()
// get1要2s执行
// get2要1s执行
// 11111

此时虽然get2延迟只有1s,但是也会等get1执行完,再顺序执行get2,最后是console.log。同样适用Promise.all()也能有同样效果,但是不要忘了加await。如果不加await就会异步执行,先后顺序不能确定。

async function get3 () {
    Promise.all([await get1(), await get2()]).then((data) => {
    	console.log(data)
    })
}
get3()
// get1要2s执行
// get2要1s执行
// [2, 4]
4、两个请求都请求拿到数据才执行第三个请求
async function get3 () {
    const res1 = await get1()
    const res2 = await get2()
    if(res1.code===200 && res2.code===200){
       console.log('两个都拿到数据了')
     }
}
get3()

以接口返回code200未正确获取到数据为例,当两个都正确拿到数据了才会执行 console.log(‘两个都拿到数据了’)。如果是断网或者请求出错等问题,使用第2个案例,使用Promise.all().then().catch

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JavaScript中,异步调用一直是一个重要的话题。许多开发者已经习惯使用Promise、回调函数等方式来处理异步代码。但是,使用async/await语法可以让异步代码更加简洁易读。 async/await是ES2017(ES8)的标准,它们允许我们以同步的方式编写异步代码。async/await基于Promises,它们提供了一种更容易理解和使用的方式来解决异步交互。 1. async 函数 要使用 async/await 异步调用,必须先创建一个async 函数, 像这样: ```javascript async function myAsyncFunction() { // code goes here } ``` async 函数是在定义时就立即执行的。这可以让我们确保异步代码在异步执行之前被定义。 2. await 关键字 在async函数中,调用异步操作时需要await关键字。它可以使函数停止执行,等待异步操作完成,然后返回异步操作的结果。 例如,可以等待一个Promise对象完整处理后返回结果,像这样: ```javascript async function myFunction() { const result = await myAsyncOperation(); console.log(result); } ``` 在这个例子里,myAsyncOperation()可能需要很长时间才能完成。await确保在异步操作返回之前,不会执行代码的后续部分。当操作完成时,async函数才会继续执行。 3. 错误处理 回调函数中的错误处理有时非常麻烦。但是,使用async /await,可以使用try...catch块十分方便地处理错误。 例如,如果await的异步函数失败,可以使用try/catch语句捕获该错误。 ```javascript async function myFunction() { try { const result = await myAsyncOperation(); console.log(result); } catch (error) { console.error('There was a problem with the async operation:', error); } } ``` 在这个例子里,如果myAsyncOperation 函数中有一个错误,将控制台记录相应错误信息。 总而言之,async/await 语法是一种很好的方式来处理异步操作。不仅它可以使异步代码更加简洁易读,同时也提供了错误处理和其他便利功能,通过这种方式,我们可以更加有效地管理我们的异步代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值