ES6添加Promise大大的方便了異步的調(diào)用入桂,ES7提出async奄薇,await來完善異步。人類就是在這樣一步一步的進(jìn)步!
async
先看看async這個(gè)函數(shù):
async function name(argument) {
statements
}
async函數(shù)就是在函數(shù)面前用async聲明
- 當(dāng)async函數(shù)在被聲明的時(shí)候他會(huì)返回一個(gè)Promise
- 當(dāng)async函數(shù)返回一個(gè)值時(shí),這個(gè)值會(huì)當(dāng)成Promise的resolve()的參數(shù)
- 當(dāng)async函數(shù)拋出一個(gè)值時(shí)候,這個(gè)值會(huì)當(dāng)成promise的reject()的參數(shù)
async function testAsync() {
return 'success'
}
const t = testAsync()
t.then((a) => {
console.log(a)
})
// success
async function testAsync() {
throw 'fail'
}
const t = testAsync()
t.then((a) => {
console.log(a)
}, (a) => {
console.log(a)
})
// fail
- async函數(shù)中有個(gè)特殊字符await,await后面若是一個(gè)異步函數(shù)抗愁,則在異步函數(shù)完成之后繼續(xù)執(zhí)行
function testSome(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x)
}, 1000)
})
}
async function test() {
let a = await testSome(1)
console.log(a)
}
test()
// 1
你是否會(huì)會(huì)考慮
let a = await testSome(1)
console.log(a)
為什么會(huì)是1呢馁蒂?那我們就要說說await
- await就像等待出征丈夫歸來的良人,若是等到它后面函數(shù)的返回值,就把返回的值作為await運(yùn)算的結(jié)果蜘腌。
說了這么多這貨到底能干些什么呢沫屡?
首先要說的是沒有他之前我們要這么寫promise:
function yieldSome(a) {
return new Promise((resolve) => {
setTimeout(() => resolve(a + 1), a)
}, 1000)
}
function yieldOne(a) {
console.log(`yieldone: ${a}`)
return yieldSome(a)
}
function yieldTwo(a) {
console.log(`yieldTwo: ${a}`)
return yieldSome(a)
}
function go() {
console.time('do')
const one = 1
yieldOne(one)
.then(two => yieldTwo(two))
.then(result => {
console.log(`result is ${result}`)
console.timeEnd('end')
})
}
go()
那現(xiàn)在我們可以這么寫:
async function go() {
console.time('doIt')
const time1 = 300
const time2 = await step1(time1)
const time3 = await step2(time2)
const result = await step3(time3)
console.log(`result is ${result}`)
console.timeEnd("doIt")
}
go()
-------------------------------------------------------華麗的分割線