async/await 是 ES2017(ES8)引入的一种处理异步操作的方法,它基于 Promise,但使用起来更加直观和易于理解。下面是 async/await 和 Promise 的区别以及使用上的一些详细列举:
1. 控制流程和语法:
1.Promise:
2.使用 .then() 和 .catch() 方法来处理异步操作的结果或错误,通过链式调用来组织异步操作的顺序。
3.Promise 链的结构相对扁平,需要处理回调函数的嵌套。
function getData() {
return fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error fetching data:', error));
}
4.async/await:
5.使用 async 函数来定义异步函数,内部使用 await 关键字等待异步操作的结果。
6.await 关键字可以在异步函数中像同步代码一样等待异步操作的完成,使得代码看起来更加清晰和顺序。
async function getData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Error fetching data:', error);
}
}
2. 错误处理:
7.Promise:
8.使用 .catch() 方法来捕获 Promise 链中的错误。
9.在 Promise 链中,错误会沿着链传递,需要确保每个 .then() 方法都有对应的错误处理。
getData()
.then(result => {
// 处理数据
})
.catch(error => {
console.error('Error in promise chain:', error);
});
10.async/await:
11.使用 try/catch 块来捕获异步函数中的错误,使得错误处理更加直观和类似于同步代码的风格。
async function processData() {
try {
const data = await getData();
// 处理数据
} catch (error) {
console.error('Error in async function:', error);
}
}
3. 返回值处理:
12.Promise:
13.Promise 可以使用 resolve 或 reject 来返回异步操作的结果或错误。
14.需要使用 .then() 方法获取异步操作的结果,或者 .catch() 方法捕获错误。
function fetchData() {
return new Promise((resolve, reject) => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => resolve(data))
.catch(error => reject(error));
});
}
15.async/await:
16.async 函数可以直接使用 return 来返回异步操作的结果,这个结果会被封装成一个 Promise 对象。
17.可以直接通过 await 来获取异步函数的返回值。
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
} catch (error) {
throw new Error('Error fetching data:', error);
}
}
总结:
18.async/await 是建立在 Promise 的基础上,提供了更加直观、易读的异步编程语法。
19.async/await 可以使异步代码的流程控制更加清晰和顺序化,减少了回调函数的嵌套。
20.错误处理更加直观,使用 try/catch 来捕获错误,使得代码结构更加类似于同步代码。
21.async/await 在处理异步操作时,更符合人们的编程习惯和直觉,使得异步代码的编写和维护更加容易。



