处理异步请求的 async/await 和 promise

简介: 处理异步请求的 async/await 和 promise

@[toc]

一、async/await

1、定义

async: 作为一个关键字放在函数前面,用于表示函数是一个异步函数,因为async就是异步的异步,异步函数也就是意味着这个函数的执行不会阻塞后面代码的执行。

2、使用

  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',a);// undefined
    console.log(1)
}
fun();  
// 立即输出 undefined 1
// 1秒后输出 1000
// 2秒后输出 2000
// 3秒后输出 3000

3、发生错误,抛出异常

如果async内部发生错误,使用 throw 抛出,catch捕获

async function demo(flag){
   
    if(flag){
   
        return 'hello world!!';
    }else{
   
        throw "happend err!";
    }
}
demo(0).then((val)=>{
   
    console.log(val);
}).catch((val)=>{
   
    console.log(val);
});
console.log('first exec');
/*
first exec
happend err!
*/

4、await 的类型

await 后面可以跟任何的JS 表达式。虽然说 await 可以等很多类型的东西,但是它最主要的意图是用来等待 Promise 对象的状态被 resolved。如果await的是 promise对象会造成异步函数停止执行并且等待 promise 的解决,如果等的是正常的表达式则立即执行。

function demo(){
   
    return new Promise((resolve, reject) => {
   
            resolve('hello promise!');
    });
}
(async function exec(){
   
    let res = await demo();
    console.log(res);  //hello promise!
})();

二、promise

Promise : 对象用于表示一个异步操作的最终状态(完成或失败),以及该异步操作的结果值。它有三种状态:pending(执行中)、success(成功resolve)、rejected(失败)

  • 1、Promise从pending状态改为resolved或rejected状态只会有一次,一旦变成resolve或rejected之后,这个Promise的状态就再也不会改变了。
  • 2、通过resolve(retValue)传入的retValue可以是任何值,null也可以,它会传递给后面的then方法里的function去使用。通过rejected(err)传入的err理论上也是没有限制类型的,但我们一般都会传入一个Error,比如reject(new Error(“Error”))
function sleep(second) {
   
    return new Promise((resolve, reject) => {
   
        setTimeout(() => {
   
            resolve('request done! '+ second + Math.random());
        }, second);
    })
}
async function bugDemo() {
   
    console.log(await sleep(2000));
    console.log(await sleep(3000));
    console.log(await sleep(1000));
    console.log('clear the loading~');
}
bugDemo();
/*
request done! 20000.9130830570273656
request done! 30000.5404841472398161
request done! 10000.26831404663460434
clear the loading~
*/

三、区别

  • async/await是写异步代码的新方式,以前的方法有回调函数和promise
  • async/await是基于promose实现的,他不能用于普通的函数
  • async/await与promise一样,是非阻塞的
  • async/await使得异步代码看起来像同步代码
  • 使用async函数可以使代码简洁很多,不需要像promise一样需要些then,不需要写匿名函数Promise的resolve值,也不需要定义多余的data变量,害避免了嵌套代码。
  • 错误处理:async/await让try/catch可以同时处理同步和异步错误。

    1、案例一

    使用promise

const maskRequet = () =>{
   
    getJSON().then(res=>{
   
        console.log(res)
    })
}

使用async

const maskRequest = async() =>{
   
  let result = await getJSON()
  console.log(result)
}

2、案例二

需求:调用promise1 , 使用promise1的返回结果去调用promise2,然后使用两者的结果去调用promise3

使用promise

const maskRequest = () =>{
   
    return promise1().then(res1=>{
   
        return promise2(res1).then(res2=>{
   
            return promise3(res1,res2)
        })
    })
}

使用async

const maskRrequest =  async()=>{
   
    const res1 = await promise1()
    const res2 = await promoise2(res1)
    return await promise( res1 , res2 )

}
相关文章
|
4月前
|
前端开发
使用 async/await 结合 try/catch 处理 Promise.reject()抛出的错误时,有什么需要注意的地方?
使用 async/await 结合 try/catch 处理 Promise.reject()抛出的错误时,有什么需要注意的地方?
174 57
|
7月前
|
前端开发
如何使用async/await解决Promise的缺点?
总的来说,`async/await` 是对 Promise 的一种很好的补充和扩展,它为我们提供了更高效、更易读、更易维护的异步编程方式。通过合理地运用 `async/await`,我们可以更好地解决 Promise 的一些缺点,提升异步代码的质量和开发效率。
168 64
|
7月前
|
前端开发 JavaScript
async/await和Promise在性能上有什么区别?
性能优化是一个综合性的工作,除了考虑异步模式的选择外,还需要关注代码的优化、资源的合理利用等方面。
211 63
|
12月前
|
前端开发 JavaScript 开发者
前端开发中的异步编程:Promise 和 Async/Await 的比较与应用
在现代前端开发中,异步编程是不可或缺的技术。本文将深入探讨Promise和Async/Await这两种主流的异步编程方式,分析它们的优劣势及在实际项目中的应用场景。通过比较它们的语法、可读性和错误处理机制,帮助开发者更好地选择和理解如何在项目中高效地利用这些技术。
|
7月前
|
前端开发 JavaScript 开发者
Async 和 Await 是基于 Promise 实现
【10月更文挑战第30天】Async和Await是基于Promise实现的语法糖,它们通过简洁的语法形式,借助Promise的异步处理机制,为JavaScript开发者提供了一种更优雅、更易于理解和维护的异步编程方式。
89 1
|
7月前
|
JSON 前端开发 JavaScript
浅谈JavaScript中的Promise、Async和Await
【10月更文挑战第30天】Promise、Async和Await是JavaScript中强大的异步编程工具,它们各自具有独特的优势和适用场景,开发者可以根据具体的项目需求和代码风格选择合适的方式来处理异步操作,从而编写出更加高效、可读和易于维护的JavaScript代码。
96 1
|
8月前
|
前端开发 JavaScript
setTimeout、Promise、Async/Await 的区别
`setTimeout` 是用于延迟执行函数的简单方法;`Promise` 表示异步操作的最终完成或失败;`Async/Await` 是基于 Promise 的语法糖,使异步代码更易读和维护。三者都用于处理异步操作,但使用场景和语法有所不同。
|
8月前
|
前端开发 JavaScript 开发者
JavaScript 中的异步编程:深入了解 Promise 和 async/await
【10月更文挑战第8天】JavaScript 中的异步编程:深入了解 Promise 和 async/await
|
9月前
|
前端开发 JavaScript
解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
该文章教授了如何使用Promise和async/await来解决异步编程问题,从而避免回调地狱,使代码更加清晰和易于管理。
解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!

热门文章

最新文章