0

開発にはNodeを使用しており、コードの95%は非同期であり、正常に機能しています。

本質的に同期している[そして他のサードパーティソフトウェアに依存している]約5%(1つの小さなモジュール)の場合、

1.「コールバックが終了するまでブロックするコード」2.一度に1つのfunction1のインスタンスとそのコールバックのみを実行する必要があります。

PS 1:私は完全に同意します、ノードは非同期作業用です、それを避けるべきですが、これは別個の非リアルタイムプロセスです。

PS 2:ノードを使用していない場合、他のサーバーサイドJSフレームワークはありますか?最後のオプションは、Pythonのような他の言語を使用することですが、JSで可能な場合は、試してみる準備ができています。

4

3 に答える 3

0

SEQはあなたの問題を解決するはずです。

同期モジュールの概要については、http://nodejsrocks.blogspot.de/2012/05/how-to-avoid-nodejs-spaghetti-code-with.htmlをご覧ください。

Seq()
 .seq(function () {
   mysql.query("select * from foo",[], function(err,rows,fields) {

        this(null, rows);
   });
 })
 .seq(function(mysqlResult) {
     console.log("mysql callback returnes:"+mysqlResult);
 })
于 2013-01-21T09:52:24.277 に答える
0

たくさんのオプションがあります。ノード非同期、カフェイン非同期サポート、IcedCoffeescriptなどを見てください。

于 2013-01-21T08:07:37.207 に答える
0

私はメンテナなので、 IcedCoffeeScriptのプラグを作りたいです。Seqのようなソリューションでうまくいくことができますが、一般的には、関数呼び出しを使用して制御フローをエンコードすることになります。そのアプローチを書き、維持するのは難しいと思います。IcedCoffeeScriptを使用すると、簡単な順次操作が簡単になります。

console.log "hello, just wait a sec"
await setTimeout defer(), 100
console.log "ok, what did you want"

しかし、もっと重要なのは、非同期コードと標準の制御フローの任意の組み合わせを処理することです。

console.log "Let me check..."
if isRunningLate()
  console.log "Can't stop now, sorry!"
else
  await setTimeout defer(), 1000
  console.log "happy to wait, now what did you want?"
resumeWhatIWasDoingBefore()

また、ループはうまく機能します。シリアルディスパッチは次のとおりです。

for i in [0...10]
   await launchRpc defer res[i]
done()

そして、これが並列ディスパッチです。

await
   for i in [0...10]
      launchRpc defer res[i]
done()

ICSは、非同期コードのシーケンシャルチェーンをスムーズにするだけでなく、可能な限り並行して実行することをお勧めします。コードまたは同時実行要件を変更する必要がある場合、変更は最小限であり、完全な書き換えではありません(標準のJS / CSまたは一部の同時実行ライブラリの場合のように)。

于 2013-04-25T23:52:08.453 に答える