2

Node.jsのアプローチはイベント駆動型であり、イベントをいつ発生させるかという問題にどのように取り組むのでしょうか。

Webアプリケーションに対して、データの作成、ページの提供、データの受信などのアクションがあるとします。

これらのイベントをどのようにレイアウトしますか?ねじ山システムでは、設計はかなり「単純」です。スレッドを特定のタスクセット専用にし、スレッド同期の道を進みます。これらのタスクがオンデマンドで低い間、スレッドはアイドル状態になり、何もしません。必要なときにコードを実行します。この道路には問題がありますが、十分に文書化されており、ある程度解決されています。

node.jsイベントのやり方に頭を悩ませるのは難しいと思います。10件のリクエストがありますが、データを作成していないため、何も提供できません。データの作成は長いアクションであり、別の5人のクライアントがデータを送信したいと考えています。今何?

私は次のテストされていないコードを作成しました。これは基本的に、登録されて実行されるコールバックの山です。実行して、今実行するコードを決定する、ある種のパイルマネージャーがあります。そのコールバックによって作成されたすべてのコールバックは、「自然に」偶数ループに追加できます。また、イベントループが制御を戻すことができるように、自己を登録する必要があります。静的コンテンツのような他のものや、これまでとは異なる方法でバインドできるもの。

  1. 現在のイベントループ状態の最後の呼び出しになるようにコールバックを登録するにはどうすればよいですか?
  2. これはこの問題を解決するための良い方法ですか?
4

2 に答える 2

3

スレッド化された環境から来るときに覚えておくべき最も重要なことは、ノードではアクションが完了するのを待たずに、アクションが完了したときに何をすべきかを指示することです。これを行うには、コールバックを使用します。これは、実行する関数を含む変数、または必要に応じて関数へのポインターです。

例えば:

 app.get('/details/:id?', function (req, res) {
    var id = req.params.ucid,
        publish = function (data) {
            res.send(data);
        };
    service.getDetails(id, publish);
});

必要なデータを作成したら、getdetailsメソッド内からpublishメソッドを呼び出すことができます。

getDetail : function (id, callback) {
    var data = makeMyData(id);
    callback(data)
}

これにより、データが応答オブジェクトに公開されます。イベントループのため、ノードは最初のリクエストからのデータ生成を中断することなく、このURLへのリクエストを引き続き処理します

于 2012-08-09T14:06:24.917 に答える
0

選択された答えが最も正しいです。コードのマイナーな変更が1つだけあり、それは次のとおりです。

この関数を次のように変更します。

getDetail : function (id, callback) {
    var data = makeMyData(id);
    callback(data)
}

それに:

getDetail : function (id, callback) {
    var data = makeMyData(id);
    setTimeout(callback, 0, data); 
}

2019年の更新:コミュニティ標準に準拠するために、新しい回答への更新を中断しました。setTimeoutイベントループの後ろへのコールバックを延期したかったので、私は使用しました。私が使用した別のオプションはprocess.nextTick()、これは、処理された現在のイベントの最後までコールバックを延期するのに役立ちました。例えば:

getDetail : function (id, callback) {
    var data = makeMyData(id);
    process.nextTick(((info)=> callback(info))(data)) 
}
于 2019-04-07T15:13:14.283 に答える