JavaScript异步编程之Promise和async/await的比较

简介: 异步方法使您能够在不等待完成的情况下并发执行多个操作。在JavaScript中,有两种常用的实现异步方法的方式:Promise和async/await。1. Promise.all()可以并行执行多个异步操作,并在所有操作都完成后得到结果;2. async/await可以顺序执行多个异步操作,并在每个操作完成后得到结果;3. Promise.all()需要使用then或catch方法处理回调或异常;4. async/await可以使用try-catch语句处理异常;5. async/await更接近于同步编程风格;

77.png


异步方法使您能够在不等待完成的情况下并发执行多个操作。在JavaScript中,有两种常用的实现异步方法的方式:Promise和async/await。

ES6引入了Promise对象,用于表示未完成但预计会完成的操作。Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。您可以使用then方法添加成功或失败的回调函数,并使用catch处理异常。Promise还提供了一些静态方法,例如Promise.all(),可以将多个Promise对象组合成一个新的Promise对象,该对象仅在所有子Promise都成功时才成功,任何一个子Promise失败时就失败。

ES7引入了async/await语法来简化异步编程。async修饰符将一个函数声明为异步函数,而await操作符等待异步操作(通常是Promise对象)的结果。异步函数返回一个Promise对象,可以使用then方法添加回调函数。相对于Promise来说,async/await语法更加优雅和清晰。

下面举例说明两者的区别和应用:

假设有三个异步函数:funcA、funcB和funcC,分别返回不同的值,并且funcC需要funcA和funcB的结果作为参数。

使用Promise.all()实现如下:

// 使用箭头函数简化写法constfuncA= () =>newPromise(resolve=> {
setTimeout(() =>resolve('a'), 1000);
});
constfuncB= () =>newPromise(resolve=> {
setTimeout(() =>resolve('b'), 2000);
});
constfuncC= (a, b) =>newPromise(resolve=> {
setTimeout(() =>resolve(a+b), 3000);
});
// 将计算结果通过代理IP上传给指定网站显示constuploadNumber(number) {
// 创建一个Promise对象returnnewPromise(function(resolve, reject) {
// 创建一个XMLHttpRequest对象,用来发送和接收HTTP请求和响应varxhr=newXMLHttpRequest();
// 设置请求方法为POST,请求地址为数字显示网站的API(假设为https://numshow.com/api)xhr.open("POST", "https://numshow.com/api");
// 设置请求头部,指定爬虫加强版代理IPxhr.setRequestHeader("X-Forwarded-For", "www.16yun.cn:8080");
// 设置请求头部,用户名、密码xhr.setRequestHeader("Proxy-Authorization", "Basic "+btoa("16YUN:16IP"));
// 设置响应类型为JSONxhr.responseType="json";
// 设置请求成功时的回调函数xhr.onload=function() {
// 如果响应状态码为200,表示请求成功if (xhr.status===200) {
// 获取响应数据,并调用resolve函数传递给Promise对象vardata=xhr.response;
resolve(data);
      } else {
// 如果响应状态码不为200,表示请求失败,并调用reject函数传递错误信息给Promise对象reject(newError("Request failed: "+xhr.statusText));
      }
    };
// 设置请求失败时的回调函数xhr.onerror=function() {
// 调用reject函数传递错误信息给Promise对象reject(newError("Network error"));
    };
// 发送请求,将数字参数作为请求体(可根据API文档修改)xhr.send(number);
  });
}
// 使用Promise.all()将funcA和funcB组合成一个新的promiseconstpromise=Promise.all([funcA(), funcB()]);
// 使用then方法获取promise的结果,并传递给funcCpromise.then(values=> {
// values是一个数组,包含了funcA和funcB的返回值returnfuncC(values[0], values[1]);
}).then(result=> {
// result是funcC的返回值,上传最终结果uploadNumber(result)}).catch(error=> {
// 处理任何可能发生的错误console.error(error);
});

使用async/await实现如下:

// 声明一个async函数constasyncFunc=async () => {
try {
// 使用await等待每个异步操作的结果,并赋值给变量consta=awaitfuncA();
constb=awaitfuncB();
constc=awaitfuncC(a, b);  
// 上传最终结果uploadNumber(c); // 'ab'  } catch (error) {
// 使用try-catch捕获任何可能发生的错误console.error(error);
  }
};
// 调用async函数,并使用then方法处理返回值(可选)asyncFunc().then(() => {
console.log('done');
});

从上面两个例子可以看出:

  1. 1.Promise.all()可以并行执行多个异步操作,并在所有操作都完成后得到结果;
  2. 2.async/await可以顺序执行多个异步操作,并在每个操作完成后得到结果;
  3. 3.Promise.all()需要使用then或catch方法处理回调或异常;
  4. 4.async/await可以使用try-catch语句处理异常;
  5. 5.async/await更接近于同步编程风格;

综合以上的介绍,可以根据不同场景选择合适方式,当需要同时执行多个相互独立或无依赖关系的异步操作时,可以使用Promise.all()来提高性能;当需要按照一定顺序执行多个有依赖关系的异步操作时,可以使用async/await来提高可读性。

相关文章
|
6天前
|
前端开发 JavaScript 开发者
Async 和 Await 是基于 Promise 实现
【10月更文挑战第30天】Async和Await是基于Promise实现的语法糖,它们通过简洁的语法形式,借助Promise的异步处理机制,为JavaScript开发者提供了一种更优雅、更易于理解和维护的异步编程方式。
14 1
|
5天前
|
前端开发 JavaScript 开发者
除了 async/await 关键字,还有哪些方式可以在 JavaScript 中实现异步编程?
【10月更文挑战第30天】这些异步编程方式在不同的场景和需求下各有优劣,开发者可以根据具体的项目情况选择合适的方式来实现异步编程,以达到高效、可读和易于维护的代码效果。
|
6天前
|
前端开发 JavaScript 开发者
深入理解JavaScript异步编程
【10月更文挑战第29天】 本文将探讨JavaScript中的异步编程,包括回调函数、Promise和async/await的使用。通过实例代码和解释,帮助读者更好地理解和应用这些技术。
16 3
|
5天前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
6天前
|
JSON 前端开发 JavaScript
浅谈JavaScript中的Promise、Async和Await
【10月更文挑战第30天】Promise、Async和Await是JavaScript中强大的异步编程工具,它们各自具有独特的优势和适用场景,开发者可以根据具体的项目需求和代码风格选择合适的方式来处理异步操作,从而编写出更加高效、可读和易于维护的JavaScript代码。
14 1
|
4天前
|
前端开发 JavaScript UED
探索JavaScript的异步编程模式
【10月更文挑战第33天】在JavaScript的世界里,异步编程是提升应用性能和用户体验的关键。本文将带你深入理解异步编程的核心概念,并展示如何在实际开发中运用这些知识来构建更流畅、响应更快的Web应用程序。从回调函数到Promises,再到async/await,我们将一步步解锁JavaScript异步编程的秘密,让你轻松应对各种复杂的异步场景。
|
6月前
|
前端开发 JavaScript 数据处理
JavaScript中的异步编程及Promise对象
【2月更文挑战第3天】 传统的JavaScript编程模式在处理异步任务时常常会导致回调地狱和代码可读性较差的问题,而Promise对象的引入为解决这一问题提供了一种优雅的解决方案。本文将介绍JavaScript中的异步编程方式以及Promise对象的使用方法和优势,帮助读者更好地理解和运用异步编程技术。
52 8
|
前端开发 JavaScript
【JavaScript】Promise(零) —— 准备工作(实例对象、函数对象、回调函数分类、捕获抛出错误)
【JavaScript】Promise(零) —— 准备工作(实例对象、函数对象、回调函数分类、捕获抛出错误)
|
前端开发 JavaScript
javascript 中promise对象中的all,allSettled,any,race方法
javascript 中promise对象中的all,allSettled,any,race方法
482 53
|
JavaScript 前端开发
Javascript中Promise对象的实现
http://segmentfault.com/a/1190000000684654 http://www.infoq.com/cn/news/2011/09/js-promise/
721 0
下一篇
无影云桌面