国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

javascript - Nodejs が非同期実裝を?qū)g裝するときに発生する問題
黃舟
黃舟 2017-07-03 11:41:44
0
6
1014

たとえば、a、b、c という 3 つの関數(shù)があり、いずれも同期操作を?qū)g行します。簡略化するために、同期操作を単純化しました。

リーリー

a() の実行の出力は 2
ですが、c 関數(shù)が同期関數(shù)ではなく非同期操作を?qū)g行する場合、たとえば

リーリー

a() を?qū)g行するとき、2 を正しく出力したい場合は、promise または async を通じて c をカプセル化する必要があります。
と同様 リーリー

c は非同期関數(shù)になるため、b は c を呼び出す必要があり、b も非同期に変更する必要があり、同様に a も非同期に変更する必要があります。 リーリー

a().then(関數(shù)(データ) {

リーリー

}) このようにして、2

を出力できます

2を正しく出力するために、aとbの両方を変更しましたが、aとbの変更を避けて正しい出力を?qū)g現(xiàn)する他の方法はあるでしょうか?

最初にコードを書いたときは非同期の狀況を考慮していなかったので、a と b のような関數(shù)は別のファイルに分散されており、それらの関數(shù)はたくさんあります。ここで、c が非同期操作を?qū)g行できるようにするには、次のようにします。変更するのは難しすぎます。他に良い方法はありますか?


以下は新しく追加された質(zhì)問です

上記の問題は、以下の回答でPromiseオブジェクトを直接返すことで解決できますが、実際のコード構(gòu)造は次のようになります

リーリー
この方法に従う場合、a と b の return メソッドを変更する必要があります。

a と b が Promise オブジェクトを返せるようにするには、

方法があるかどうかわかりません。このような構(gòu)造の a および b 関數(shù)を変更せずに正しい出力を?qū)g現(xiàn)します。

黃舟
黃舟

人生最曼妙的風(fēng)景,竟是內(nèi)心的淡定與從容!

全員に返信(6)
阿神

申し訳ありませんが、ノードは明示的に非同期であるため、関數(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中只進(jìn)行了同步操作。此時需要在函數(shù)a でキャプチャするには、コードを次のように変更できます

リーリー

では、この関數(shù) a(),b() が非同期操作の戻り値を処理しない場合、なぜ Async 関數(shù)に変更する必要があるのでしょうか?

扔個三星炸死你

http://fibjs.org/docs/manual/... を試して、同期に直接変換できます

滿天的星座

畫面を見つめて何度も下書きをしたのですが、結(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 に代入されるため、ループを終了することはできません。

しかし、この質(zhì)問は非常に興味深いと思います。著者は外部バイナリライブラリを通じてローカルブロッキングの問題を解決しました。

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)在非同期プロセス制御を扱うのに主流ですが、それがないとできないというわけではありません。このような単純な問題はイベント メソッドに戻って処理できます。

リーリー
最新のダウンロード
詳細(xì)>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート