動機

想到就來寫一寫

promise is monad

promise是從callback hell來的,而每個callback都有接callback的變數,所以可以用之前寫過的方式來把它簡化

最後拿到的就是promise

await is bind & async is return

在monad中 return 是 讓一個值變成monad 而 bind 是從monad中取值,再包成monad

對應到 Promise就是

  • then(() => {}): bind
  • Promise.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
}