關於await和async
async的意思是非同步
await的字面意思是等一下
還是比較形象的,通常來說,作為ES7的語法標準,async一般修飾一個函式,說明這個函式是非同步的。await一般是用來執行非同步操作的,很多情況下它的後面會跟著Promise物件
async和await提出的意義在於:用同步的方式處理非同步!!
定時器是最常見的非同步操作,先用它定義一個非同步函式。
function sleep(){
setTimeout(()=>{
return 1
},3000)
}
因為await後面跟著的是一個Promise物件。就把它封裝一下:
let sleep = () => {
return new Promise((resolve,reject)=>{
setTimeout(() => {
resolve(2);
},3000)
})
}
async function aaa() {
let i = await sleep()
console.log(i);
}
aaa();
最終這樣使用出來,3秒之後打印出2。但是如果sleep不用Promise封裝,列印的就是undefined。
await可以非同步執行一個函式。通常用於執行一個回撥函式,await next();
需要注意的地方:除了await後面跟一個Promise,await必須在async定義的函式中使用。
關於async和await的詳細說明:
1、無論函式中是否是非同步的,async定義的函式的返回值都是promise。
async function getName() {
return 'mapbar_front';
}
console.log(getName());//resolved Promise
上面的這個函式,返回值是一個被注入的Promise物件,注入的值是 ‘mapbar_front’ 這樣的一個字串。
當然,如果上面的函式沒有返回值,它的執行結果依然是Promise物件,而且被注入的值是undefined。
2、await可以取得的值是Promise注入的值,而不是Promise。
async function getName() {
return 'mapbar_front';
}
console.log(getName());//resolved Promise
async function doIt() {
const data = await getName();
console.log(data);//mapbar_front
}
doIt();
3、解決了什麼問題?
回撥函式是前端的一大弊病。
Promise解決了回撥函式的層層巢狀的痛楚。
而async和await是基於Promise的語法糖,從使用上來說,更加的清晰簡潔。
4、關於async和await的弊病是什麼?
弊病一:async語法是ES7的標準,所以會存在相容性問題。需要使用babel的解析。
弊病二:await必須配合async使用,但是我們想做到,把await得到的值,return出去,這個需求就做不到,一般return出去的值是一個pedding Promise物件。
function step() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(1234)
},1000)
})
}
async function doIt() {
const result = await step();
console.log(result);//1234
return result
}
doIt();//打印出1234
console.log(doIt());//Promise物件