Skip to content

Instantly share code, notes, and snippets.

@kawaz
Last active May 28, 2020
Embed
What would you like to do?
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

This comment has been minimized.

Copy link
Owner Author

@kawaz 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

This comment has been minimized.

Copy link
Owner Author

@kawaz 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