4

Node.js の非同期メソッド API について質問があります。

それで、私は関数を持っています、それを呼びましょうlongSetup(callback)

その名の通り、longSetup(callback)完成までに時間がかかります。ただし、このセットアップは他のことと並行して行うことができます。だから、longSetup()起こっている間、私は他のものも同様にセットアップすることができます.

したがって、一度longSetup()完了すると、そのクラスは などの別の関数を実行する準備が整いserveData()ます。

さて、いつ召喚されるかわかりませんserveData()serveData()ユーザー I/O に基づいており、終了前longSetup()または終了後に呼び出すことができますlongSetup()。また、直接呼び出すことはありませんserveData()

が正常に実行されるlongSetup()前に完了する必要があるのは事実ですが、非同期で実行できるという事実を利用したいので、同期バージョンの;を実装したくありません。その間に他の設定をしておけばよかった。serveData()longSetup()longSetup()

いつでも呼び出せるので、呼び出されたときに is が完了しserveData()ているかどうかを確認したい。完了したら、 に進みます。そうでない場合は、完了するまで待ってから実行を続行します。は一度しか呼び出されないため、ほとんどの場合、待機しません。また、ユーザー I/O に時間がかかる場合も、初回起動時までに完了します。longSetup()serveData()serveData()longSetup()longSetup()longSetup()serveData()

別の関数を実行する前に関数が戻るのを待つ/別の関数を次々と起動するなどに関するいくつかのSOの質問と回答を経験しました.Nodeの非同期の方法とコールバックを使用する理由を理解しています. ただし、これは別のユースケースであり、ノードが別の非同期関数を待機する方法を提供するかどうか疑問に思っていました。

皆さんありがとう!

4

2 に答える 2

2

@arturgrzesiakの答えはserveDataから呼び出しており、完了するまでlongSetup実行を遅らせる方法がありませんでした。彼の答えをもっと詳しく読んで編集すると、私が間違っているように見え、. ただし、セットアップ中に複数のユーザーがデータを要求した場合など、私のソリューションを複数回呼び出すことができるようにする必要があります。serveDatalongSetupserveDatalongSetupserveData

var setupFinished = false;

var longSetup = function() {
    ...
    // at end:
    setupFinished = true;
}

var serveDataWrapper = function(query){
  if(!setupFinished){
    setTimeout(
      function(){
        serveDataWrapper(query);
      },
      200 //ms
    );
  } else { // setup is finished
    serveData(query);
  };
}

var serveData = function (query) {
  // longSetup is now guranteed to be complete
};

app.get('/', function(req, res){
  serveDataWrapper(req.query['query']);
});
于 2013-11-14T21:47:47.957 に答える
1

これはあなたに適した解決策かもしれないと思います:

var setupInfo = { serveData : false, setupFinished : false }

var longSetup = function() {

    ...

    // at the very bottom
    if (setupInfo.serveData) {
        serveData();
    }
    setupInfo.setupFinished = true }
}

var serveData = function () {
    // at the very top
    if (!setupInfo.setupFinished){
         setupInfo.serveData = true;
         return;
    }

    ... 
}

serveData を複数回使用する場合は、 simple ではなくカウンターを保持する必要がありますbool


node.js がタスクに何らかの API を提供するとは思わないでください。ただし、この問題に対処するためのpromise pattern. これはかなり古いですが、このトピックに関する有用な記事です。

于 2013-11-14T20:58:34.910 に答える