に拒否ES2017非同期/待つと素晴らしいパターンがあるの取り扱いしかし、私は非同期的に、私が再割り当てから保護したい値を得たいとします(データベースセッションなど)。しかし、私はまだ非同期/待機パターンを使用したいと思います。はエレガント `await`ed Javascriptを約束
constのブロックがスコープされているので、以下は動作しません:もちろん
async function() {
try {
const result = await get_session()
} catch (err) {
console.log(`This block should catch any
instantiation errors.`)
return false
}
// Can't get at result here because it is block scoped.
}
はあなたがtry
ブロック内の関数の残りの部分を実行することもできますが、その後、あなたは秋聞かせすべきことであるが、捕まるのエラーを危険にさらしますどこかで(たとえば、私はテストの失敗のようなエラーがテストスイートに落ちる必要があるが、ドライバのインスタンス化を自分自身で処理する必要があるテストを書くこのチャレンジを打った。おそらく、私はここで何らかのアンチパターンに陥るだろう。 )
簡単な答えは明らかにここでそのパターンを使用しないことです。代わりに約束とコールバックを使用してください。または、var
を使用し、ブロックスコープconst
とlet
を避けてください。しかし、私は他の考慮事項のための再割り当て保護とブロックスコープの利点が好きです。
[質問]:Is there a way to wrap an await/async try/catch block to every function?潜在的な解決策の1つと思われますが、確かにtry/catch
のようにわかりません。 try/catch
が機能の範囲を壊しておらず、try/catch
ブロック内のreturn
を使用できるという事実は、より手続き的なロジックを非同期コードに持っていくという精神に沿っているように思えます。
理想的には、const x = await y() catch (err)
またはconst x = await y() || fail
のような何かをしたいと思います。しかし、私は構文的に正しいです同様の流れでは何も考えることはできません。
UPDATE: 別の代替の下@ jmar777によって示唆されるようです:
おそらく私は実際には、これらの最後の2つの例に見つけた最も近いconst x = await y().catch(() => {/*handle errors here*/})
。しかし、上記の例では、ダウンストリーム実行をブロックするreturn
スコープが壊れています。何が物事を扱うかのような素晴らしい同期的な方法です。
各ソリューションにはトレードオフがあります。
さまざまなアプローチを見ても興味深い質問がありましたので、機能ブロックの上部にある変数をマニュアルでlet
で手作業で解決しました(jmar777の答えに記載されています)。今。
async/awaitはES7(ES2016)の一部ではありません。今年のリリース、ES2017の一部になる予定です。 –