Skip to content

Instantly share code, notes, and snippets.

@kawaz
Last active May 28, 2020 04:31
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kawaz/9113d60cade5ef0a6d004341986b5abd to your computer and use it in GitHub Desktop.
Save kawaz/9113d60cade5ef0a6d004341986b5abd to your computer and use it in GitHub Desktop.
Promiseの配列を {ok:true, value} か {ok:false, err} の配列にする関数。Promise.all とか Promise.race だとどれか一つのPromiseがrejectとかされた時点で全部中断されちゃうのが使いにくい時があるので。→ ES2020に入ってくる Promise.allSettled() がほぼ同じ感じの関数になるので今後はそっちを使う事を推奨。
parallel = promises => Promise.all(promises.map(p=>new Promise(done=>{try{p.then(value=>done({ok:true,value})).catch(err=>done({ok:false,err}))}catch(err){done({ok:false,err})}})))
@kawaz
Copy link
Author

kawaz commented Apr 21, 2020

こんな感じの結果が得られる。parallel関数の実行自体は配列が渡される限りは失敗しない(ハズ)。

parallel([
  Promise.resolve("success"),
  Promise.reject("fail"),
  new Promise(done=>setTimeout(done,1000)),
  null,
  ()=>1
]).then(res=>console.log(res))

[
  {ok: true, value: "success"},
  {ok: false, err: "fail"},
  {ok: true, value: undefined},
  {ok: false, err: TypeError("Cannot read property 'then' of null")},
  {ok: false, err: TypeError("p.then is not a function")}
]

最後の2個はこんな感じのエラーオブジェクトが入ってるイメージ

@kawaz
Copy link
Author

kawaz commented May 28, 2020

Promise.allSettled が 2019-07 で Stage4 になってたので ES2020 に入ってくるようだ。Chrome 80 から使えてたようで実行イメージは↓こんな感じ。

スクリーンショット 2020-05-28 12 34 19

Promise オブジェクト以外は単純に渡した値がそのまま "fullfilled"value で返ってくるみたいだね。Function や AsyncFunction を勝手に Promise 化して実行するようなことはしないっぽい。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment