動機
想到就來寫一寫
promise is monad
promise是從callback hell來的,而每個callback都有接callback的變數,所以可以用之前寫過的方式來把它簡化
最後拿到的就是promise
await is bind & async is return
在monad中 return 是 讓一個值變成monad 而 bind 是從monad中取值,再包成monad
對應到 Promise就是
then(() => {})
: bindPromise.resolve(val)
: return
但是寫Promise.resolve(val)
配function有點長,所以有了async
寫then((x) => { return x})
只是為了取個值也很煩,所以有了await
從promise到await
正常的code
let a = 1
let b = 2
let c = 3
return a+b+c
包成callback
(a) => {
return (a,b) => {
return (a,b,c) => {
return a+b+c
}(1,2,3);
}(1,2);
}(1);
// OR
(a) => {
return (b) => {
return (c) => {
return a+b+c
}(3);
}(2);
}(1);
用promise來寫,因為then之間的context不能共享,所以會變得很難看
new Promise(() => { return 1 })
.then((a) => { return [a,2]})
.then((a,b) => { return [a,b,3] })
.then((a,b,c) => { return a+b+c })
//OR
new Promise(() => { return 1 })
.then((a) => { return new Promise(() => { return 2})
.then((b) => { return new Promise(() => {return 3})
.then((c) => { return a+b+c })})})
用await來拆
async function a() { return 1 }
async function b() { return 2 }
async function c() { return 3 }
async function demo() {
let a = await a()
let b = await b() // 這裡可以當成then的參數列自動多了a,b,同時都會被帶對應的值
let c = await c()
return a+b+c
}