點燈坊

失くすものさえない今が強くなるチャンスよ

Currying 與 Asynchronous Function

Sam Xiao's Avatar 2019-09-03

在 FP 我們會使用 Currying Function 取代傳統 Multiple Argument Function,但若回傳為 Promise,還能繼續使用 Currying 嗎 ?

Version

macOS Mojave 10.14.6
VS Code 1.37.1
Quokka 1.0.240
ECMAScript 2015

Synchronous Function

let fn = x => y => x + y;

fn(1)(1); // ?

若是傳統 synchronous function,則 currying 完全沒有問題。

currying000

Promise

let fn = x => y => Promise.resolve(x + y);

await fn(1)(1); // ?

若要回傳 promise,則必須使用 Promise.resolve()x + y 包起來後回傳。

currying001

Asynchronous Function

let fn = x => async y => x + y;

await fn(1)(1); // ?

事實上也能在最後一個 argument 前加上 async,則回傳也是 promise。

currying002

let fn = async x => y => x + y;

await fn(1)(1); // ?

但切記 async 要寫在最後一個 argument 前,而不是第一個 argument。

因為要回傳的是 x + y 的 promise,而非 y => x + y 的 promise。

currying003

Conclusion

  • Currying 與 promise 是 ECMAScript 兩大神技,沒想到竟然可以無縫合作,可直接將 currying 也加上 async 成為 asynchronous function,但別忘了 async 要加在最後一個 argument 前