たとえば、a、b、c という 3 つの関數(shù)があり、いずれも同期操作を?qū)g行します。簡略化するために、同期操作を単純化しました。
リーリーa() の実行の出力は 2
ですが、c 関數(shù)が同期関數(shù)ではなく非同期操作を?qū)g行する場合、たとえば
a() を?qū)g行するとき、2 を正しく出力したい場合は、promise または async を通じて c をカプセル化する必要があります。
と同様
リーリー
a().then(関數(shù)(データ) {
リーリー}) このようにして、2
を出力できます2を正しく出力するために、aとbの両方を変更しましたが、aとbの変更を避けて正しい出力を?qū)g現(xiàn)する他の方法はあるでしょうか?
最初にコードを書いたときは非同期の狀況を考慮していなかったので、a と b のような関數(shù)は別のファイルに分散されており、それらの関數(shù)はたくさんあります。ここで、c が非同期操作を?qū)g行できるようにするには、次のようにします。変更するのは難しすぎます。他に良い方法はありますか?
以下は新しく追加された質(zhì)問です
リーリー
この方法に従う場合、a と b の return メソッドを変更する必要があります。
方法があるかどうかわかりません。このような構(gòu)造の a および b 関數(shù)を変更せずに正しい出力を?qū)g現(xiàn)します。
人生最曼妙的風(fēng)景,竟是內(nèi)心的淡定與從容!
申し訳ありませんが、ノードは明示的に非同期であるため、関數(shù)を同期から非同期に変更すると、それに依存する関數(shù)も変更する必要があります。リファクタリング時には確かに頭の痛い問題ですが、それでも変更する必要があります。我慢して変えましょう。
async キーワードを必要としない fibjs のようなリファクタリングは、c を変更する場合、暗黙的な非同期を示す必要がないため、a と b を変更する必要はありません。
Promise についてはまだ十分に理解できません。ここでb()
和a()
を変更する必要はありません。
この Promise を関數(shù) c
,只需要返回一個promise
對象,經(jīng)過函數(shù)b
的時候,直接同步返回這個Promise對象,不需要改動函數(shù)b使其為異步函數(shù),因為異步操作是在函數(shù)c
中,b
中只進行了同步操作。此時需要在函數(shù)a
でキャプチャするには、コードを次のように変更できます
では、この関數(shù) a(),b()
が非同期操作の戻り値を処理しない場合、なぜ Async 関數(shù)に変更する必要があるのでしょうか?
畫面を見つめて何度も下書きをしたのですが、結(jié)局失敗してしまいました
JS で現(xiàn)在の関數(shù)をブロックしながら、時間內(nèi)に Promise の解決を?qū)g行する方法は思いつきません。失敗のアイデアは次のとおりです
リーリー問題は、while(c_result===null && n++<100){}
阻塞了函數(shù)c_sync, 但是也阻止了.then
シングルスレッドの非同期メカニズムにより、コールバックが実行されるにもかかわらず、スレッドがビジー狀態(tài)の場合、コールバックがキューにジャンプできず、その結(jié)果 c_result が何もできなくなることです。ループの実行中に変數(shù) m に代入されるため、ループを終了することはできません。
http://blog.csdn.net/xingqili...
私の理解は次のとおりです:
js エンジン自體のイベント ループに基づいて、特定のブロックをブロックすることはできません。js コードの場合、エンジンのイベント ループは下部にありますが、外部バイナリ モジュールの場合は、それ自體をブロックできます。そして、JS エンジンのイベント ループが毎回イベント キューを完全に橫斷するようにします。これにより、JS エンジン內(nèi)の新しいイベントが獨自のブロック期間中に処理できるようになります。Let a() 出力 Promise は確かに私が述べた問題を解決することができます
しかし、実際にコードを変更してみると、ほとんどのコードの構(gòu)造は上記の問題とは異なり
、新しく追加された以下の構(gòu)造であることがわかりました
敬意を表しますが、あなたは、node.js のイベント ループ メカニズムとイベント コア モジュールを深く理解していません。
promise や aysnc/await は確かに現(xiàn)在非同期プロセス制御を扱うのに主流ですが、それがないとできないというわけではありません。このような単純な問題はイベント メソッドに戻って処理できます。