【JS】Async-await和Promise的区别
Async/await 是建立在Promise上的,不能被使用在普通回调以及节点回调
Async/await 和 Promise 很像,不阻塞
Async/await 代码看起来很像同步代码。
语法
假设getJSON返回值是Promise,并且Promise resoles有一些JSON对象,我们只想调用他并且记录JSON并返回完成。
使用Promise
1 | const makeRequest = () => |
使用Async
1 | const makeRequest = async() => { |
区别
- 在函数前有一个关键字
async,await关键字只能在使用async定义的函数中使用。任何一个async函数都会隐式返回一个promise,并且promise resolve的值就是return返回的值 (例子中是done)。 - 不能在函数开头使用
await
有哪些好处
- 简洁的代码,使用
Async可以让代码变简洁很多,不需要像Promise一样需要使用then
比如条件语句,对比一下两种方式的写法:
使用Promise
1 | const makeRequest = () => { |
使用Async
1 | const makeRequest = async () => { |
- 中间值
在一些场景中,也许需要 promise1 去触发 promise2 再去触发 promise3,这个时候代码应该是这样的:使用1
2
3
4
5
6
7
8
9
10
11const makeRequest = () => {
return promise1()
.then(value1 => {
// do something
return promise2(value1)
.then(value2 => {
// do something
return promise3(value1, value2)
})
})
}Async就会变得很简单:1
2
3
4
5const makeRequest = async () => {
const value1 = await promise1()
const value2 = await promise2(value1)
return promise3(value1, value2)
} - 错误栈
如果Promise连续调用,对于错误的处理是很麻烦的。因为无法知道错误出在哪里,像这样:但是对于1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17const makeRequest = () => {
return callAPromise()
.then(() => callAPromise())
.then(() => callAPromise())
.then(() => callAPromise())
.then(() => callAPromise())
.then(() => {
throw new Error("oops");
})
}
makeRequest()
.catch(err => {
console.log(err);
// output
// Error: oops at callAPromise.then.then.then.then.then (index.js:8:13)
})Async就简单许多:原文链接:Async/await 和 Promises 区别1
2
3
4
5
6
7
8
9
10
11
12
13
14
15const makeRequest = async () => {
await callAPromise()
await callAPromise()
await callAPromise()
await callAPromise()
await callAPromise()
throw new Error("oops");
}
makeRequest()
.catch(err => {
console.log(err);
// output
// Error: oops at makeRequest (index.js:7:9)
})