講述完工具人的起源
方函式:終於到了最後一個能力async
模式。
我:到現在都遇不到JS...
先知道async
跟generator
使用方式非常相似,generator
:用yield
控制流程async
:用await
控制
兩者差別在於async
回傳的是一個Promise
物件而不是{value:any,done:Boolean}
。
generator
的可參考我在D14寫關於生成器的文章async function
建構子建立,基本架構為:
//宣告
async function adds(){
....;
};
//裝入變數
const x = async function()=>{}
當async
被呼叫時,會回傳一個Promise
物件:
Promise
的狀態為resolve
,並回傳值。Promise
狀態則為reject
並回傳值。async
回傳背後的道理不知道你會不會好奇,當你呼叫async
裡面看起來回傳1
,實際上卻是Promise
物件,背後是什麼道理。
當async
回傳1
async function asyncFn(){
return 1;
}
asyncFn();
是不是會得到相同的結果,原因是當你用async
時,它會偷偷幫你轉譯,所以實際上它長得就像是:
function normal(){
return Promise.resolve(1);
}
normal();
await
數量不限,可寫可不寫
async
內使用,在async function
以外用會syntax error
,function hi(){
await console.log(x);
}
hi()
Promise
處理非同步使用async function add(){
await setTimeout((x=1)=>console.log(x),20000);
console.log("x")
}
add()
之所以可以這樣使用,是因為當你使用非Promise
的非同步語法時,它會自動將你輸出預設為resolve
,並回傳值。
加入awiat
就能避免流程被setTimeout
卡頓。
Promise
都怎麼用呢?await
後面會是new Promise
async function add(){
await new Promise((resolve,reject)=>{
resolve("accept");
reject("deny")
});
await new Promise((resolve,reject)=>{
resolve("accept1");
reject("deny2")
});
}
add()
async
vs Promise
從可讀性比較假設你現在有三件事情想依序被執行
Promise
若用Promise
,就是透過then()
去串連
function a() {
return new Promise((resolve, reject) => resolve("hi a"));
}
function b() {
return new Promise((resolve, reject) => resolve("hi b"));
}
function c() {
return new Promise((resolve, reject) => resolve("hi c"));
}
a()
.then(function (x) {
console.log(x);
return b();
})
.then(function (x) {
console.log(x);
return c();
})
.then((y) => console.log(y));
async
async function hi() {
let res1 = await new Promise((resolve, reject) => resolve("hi a"));
let res2 = await new Promise((resolve, reject) => resolve("hi b"));
let res3 = await new Promise((resolve, reject) => resolve("hi c"));
console.log(res1);
console.log(res2);
console.log(res3);
}
hi();
比較起來,是不是好讀許多呢?
-- to be continued --
一切都要結束了?
那今天就到這邊摟!
每天的休息,是為了後面的追求,明天見。