非同期関数への参照を含む配列(約束または単純な値を返す)が与えられると、各要素を解決するために、少なくとも1つの要素が真理値に解決されます。少なくとも1つがNode.jsの真理値を返すまで、順次非同期関数のリストを反復する
var hasAccess = (user.isAdmin() || user.isManager() || entity.isOwnedBy(user));
上記のコードはうまく同期機能のために動作しますが、非同期のもののために中断します:
アイデアは、この単純な同期コードから来ました。私は上記のコードの非同期置換を探しています。
私はそれが(簡潔にするためにES6構文で)このように呼ばれることを期待:
atLeastOneTruthy([
() => user.isAdmin(), // Called first
() => user.isManager(), // Called second if first returned falsy value
() => entity.isOwnedBy(user) // Called third if all previous returned falsy values
]).then(function (result) {
// result === (true || false)
}).catch(function() {
// Promise chain is rejected when at least one element in rejected
});
例のすべての機能のリターン上の約束または単純な値のいずれかを直接。
このソリューションはすぐに使用できますか?私はBluebirdの約束を使っていますが、私はそれに適したものを見つけることができませんでした。私は使用できません。 Promise.any()
です。これは、解決された約束のみをチェックし、戻り値はチェックしないためです。私はPromise.map()
を使用することはできません。なぜなら、すべての機能を実行するためですが、必要なとき(つまり前の要素が失敗したとき)にのみ実行することはできません。
ノードモジュールの推奨は素晴らしいです(私は見つけられませんでした)。しかしながら、実装について疑問があるので、atLeastOneTruthy()
のコード化のコンセプトも良いでしょう。
'then'発現に自身を通過innerHandler'関数式を' @zerkms。これは、関数がスタックに複数回現れるという意味で再帰的ではありませんが、実行が自己参照であるという意味で再帰的です。 –
ああ、確かに、それは私が見落としたものです。 – zerkms
非常に洗練されたソリューション!私は自分自身の "再帰的"実装を終了しましたが、私はあなたのソリューションがより好きです。時間をいただきありがとうございます! ; ) –