鐵人賽
React
javascript
nodejs
鐵人賽第26天,今天我們要來介紹另一種實踐Promise
的指令async...await
async
是另一種呼叫異步程序
,也就是Promise
的方法。func
前面加個async
,編譯器就會知道,這個func
會回傳一個Promise
,因此自動的包裝他在Promise.resolve(回傳值)
Promise
簡單的範例,
- 啟動
resolve
- 用
then
接收resolve
的結果
let p = Promise.resolve("okla") // 啟動resolve
p.then(res=>console.log(res)) // 接收resolve的資訊,順勢印出 okla
async
相當容易上手,async func
回傳的Promise
,讓我們可以直接使用then/catch/finally
。 async function test(){
return "okla";
}
// let test = async ()=>"okla"; //<--使用async+arrow func的範例
test().then(res=>console.log(res))
await
與async
密不可分,也就是說,await
必須使用在async func
之內。await
代表的意思~我等待著這個Promise直到它處理完!!
async function waitForMe() {
let p = new Promise((res)=>{
// 讀秒
for(let i=1; i<=5; i++){
setTimeout(()=>console.log(`${i} sec`), i*1000); }
// 5秒後送用resolve送出資訊
setTimeout(()=>res("okla"),5000)
});
let result = await p; //<-- await作為等待,直到這個Promise結束
console.log(result);
// p.then(res=>console.log(res)) //<-- 當然,還是可以用 then()來接收
}
waitForMe();
1 sec
2 sec
3 sec
4 sec
5 sec
okla
function wait(delay){
return new Promise(resolve => {
setTimeout(resolve,delay);
});
};
wait().then(() => {
console.log("1st call"); // 印出1st call
return wait(1000); // 等待一秒後觸發
}).then(() => {
console.log("2nd call"); // 印出2nd call
return wait(2000); // 等待二秒後觸發
}).then(() => {
console.log("Finished"); // 印出 Finished
});
function wait(delay){
return new Promise(resolve => {
setTimeout(resolve,delay);
});
};
async function Run(){
console.log("1st call"); // 印出1st call
await wait(1000); // 等待一秒後觸發
console.log("2nd call"); // 印出2nd call
await wait(2000); // 等待二秒後觸發
console.log("Finished"); // 印出 Finished
}
Run() // 啟動async
Promise
的原理,到async...await
的運用,相信各位對異步程序有了更深一層的了解!