2019第四发javascript
一句话解释:async 函数,就是 Generator 函数的语法糖。css
JavaScript 代码:java
const doSomethingAsync = () => {
return new Promise((resolve) => {
setTimeout(() => resolve('I did something'), 3000)
})
}
const doSomething = async () => {
console.log(await doSomethingAsync())
}
console.log('Before')
doSomething()
console.log('After')
复制代码
将async
关键字添加到任何函数,意味着该函数将返回一个Promise。git
const aFunction = async () => {
return 'test'
}
aFunction().then(alert) // This will alert 'test'
复制代码
而且与下面的代码等价:github
const aFunction = async () => {
return Promise.resolve('test')
}
aFunction().then(alert) // This will alert 'test'
复制代码
每个步骤都须要以前每一个步骤的结果。编程
const getFirstUserData = () => {
return fetch('/users.json') // get users list
.then(response => response.json()) // parse JSON
.then(users => users[0]) // pick first user
.then(user => fetch(`/users/${user.name}`)) // get user data
.then(userResponse => response.json()) // parse JSON
}
getFirstUserData()
复制代码
而且与下面的代码等价:json
const getFirstUserData = async () => {
const response = await fetch('/users.json') // get users list
const users = await response.json() // parse JSON
const user = users[0] // pick first user
const userResponse = await fetch(`/users/${user.name}`) // get user data
const userData = await user.json() // parse JSON
return userData
}
getFirstUserData()
复制代码
每个步骤都须要以前每一个步骤的结果。promise
const promiseToDoSomething = () => {
return new Promise(resolve => {
setTimeout(() => resolve('I did something'), 10000)
})
}
const watchOverSomeoneDoingSomething = async () => {
const something = await promiseToDoSomething()
return something + ' and I watched'
}
const watchOverSomeoneWatchingSomeoneDoingSomething = async () => {
const something = await watchOverSomeoneDoingSomething()
return something + ' and I watched as well'
}
watchOverSomeoneWatchingSomeoneDoingSomething().then((res) => {
console.log(res)
})
//I did something and I watched and I watched as well
复制代码
async function error() {
try{
//do something
}catch(err){
console.log(err)
}
}
复制代码
由于async的返回值也是个promise,跟promise的错误处理差很少。此外,async里面throw Error 至关于返回Promise.reject。异步
async function F(){
throw new Error('test1')
}
var f=F();
f.catch(function(e){console.log(e)});
// Error:test1
复制代码
在async中,await的错误至关于Promise.reject。async
async function F(){
await Promise.reject('Error test1').catch(function(e){
console.log(e)
})
}
var f=F(); // Error:test1
复制代码
await若是返回的是reject状态的promise,若是不被捕获,就会中断async函数的执行。
async function F(){
await Promise.reject('Error test1');
await 2
}
var f=F()
复制代码
上述代码中,前面的Promise.reject没有被捕获,因此不会执行await 2
每个特性的出现,总有它的用途,而只有用了,才能更好地理解它。
JavaScript的异步编写方式,从 回调函数 到 Promise、Generator 再到 Async/Await。表面上只是写法的变化,但本质上则是语言层的一次次抽象。让咱们能够用更简单的方式实现一样的功能,而不须要去考虑代码是如何执行的。
换句话说就是:异步编程的最高境界,就是根本不用关心它是否是异步。