twitterにどうぞ。この広告は、90日以上更新していないブログに表示しています。いうライブラリを作ってみた。p3の順番に実行したい場合、reduceが使える。p3を並列に実行した上で、callbackの順序を保証したい場合。テスト用に、一定時間まってからvalueでresolveする関数resolveLaterを定義しておく。タスクそのものは並列に実行されるが、callbackは順番に実行される。p3自体を順番に実行したい場合、つまり、あるタイミングで同時に動いてるpromiseが1つである必要がある場合。Testingがおすすめで、jestを使うと、setTimeout系の関数自体を乗っ取って(実行順序を保証しながら)同期的に実行しながらsetTimeout.mock.callsに呼び出された時のmock関数の引数を記録していってくれるので、実際の非同期で不確実な動作に依存せずにテストしやすいコードを書ける。非同期のテストはどちらにしろ複雑になりがちで、ある程度のところで諦めてテストケースは書くがチェックは手動、という風にするのが現実的なのかもしれない。追記コメントでライブラリで解決していることを実現できていないと指摘されたので、その他の例について触れる。上記コードにはなかった、順番に実行したいpromiseがコード中で動的に追加される場合。0))).then(callback);このようにreduceを手動で展開することで動的に追加できるようになる。0)).then(callback);このようになる。Promiseの上にコントロールフローを実装するライブラリを使うより、このように直接promiseを組み合わせる手法を使ったほうがいいと思う理由は複数あって、まず、自由度の点。ここに載せたコードでは、全体の状態がPromiseとして表現されていて取り出すことができる(reduceを直接使った例では、reduceが返すPromiseがそれにあたる)ので、複数のパターンを組み合わせることができる。具体的には、最初のpromise数個をarrayとして入れておき、動的に実行したいものを後から追加したい場合。1000))).then(callback);このようにできる。reduce相当の処理をしていないコードのもう一つの問題は、エラー処理。動的にタスクを追加する例では全体のエラーという概念は薄いかもしれないが、例えば、記事中のコントロールフローライブラリでは、すべての実行が終わった状態というものをPromiseとして取り出せない。よって、全体のどこかでエラーがあった場合にそれらをcatchする関数、というものが書けない。});などを最後に追加することで、エラー処理が握りつぶされるわかりづらいエラーが防げる。Class()...2008-06-20Greasemonkey0.8の@require一度取得したものをずっと使いまわすのなら、SITEINFOの取得が...2008-06-07AutoPageLoaderをxhtmlに対応させたり。doの見分け方と使い方についてなどArchiveはてなブログをはじめよう!javascripterさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。