0

今日はnodejsへの私の最初の進出であり、次のロジックの流れを理解しようとして特に困惑しています。ロジックは次のとおりです。

request({ uri: db.createDbQuery('identifier:abcd1234') },
                    function(err, response, body) {
                        response.should.have.status(200);
                        var search = JSON.parse(body);
                        search.response.numFound.should.equal(1);
                        done();
                    });
        });

より高いレベルでは、http 要求が行われ、関数が応答を受け取り、それに何かをしている時点で呼び出されていることを理解しています。私が理解しようとしているのは、呼び出しの適切な順序と、上記のロジックで変数のバインドがどのように行われるかです。コンパイラは、リクエストからの戻り値を無名関数にバインドする方法をどのように知っていますか? 基本的に、このスニペットの内部で物事がどのように機能するかを理解したいと思います。

ありがとう

4

2 に答える 2

3

あなたの質問はnode.jsに固有のものではありません。これは基本的にjavascriptの機能です。

request()基本的に、次のように定義されているものを呼び出していますfunction request(obj, callback)

内部的に、http 要求が呼び出され、完了すると、callback実際には関数ポインターである呼び出しが呼び出されます。

function request(obj, callback){
    //http request logic...
    var err = request_logic_internal_function();
    var response = ...
    var body = ...


    callback(err, response, body)
}

コードは実際には次のように再構築できます。

var options = { uri: db.createDbQuery('identifier:abcd1234') };
var request_callback = function(err, response, body) {
                        response.should.have.status(200);
                        var search = JSON.parse(body);
                        search.response.numFound.should.equal(1);
                        done();
                    };
request(options, request_callback);

基本的に行っているのは、関数ポインターを変数として送信することです。

于 2012-06-05T19:13:13.677 に答える
1

使用しているライブラリがわかりません。コードのグローバルスコープに、、、などのメソッドを割り当てることで、それらを匿名化した可能性がrequestありdoneますdb

言えることはこれです:

  1. そのインデントはひどいものであり、最初はそれが何をしていたかについて私を誤解させましたgg=G。適切にインデントされるように、コードを(vim構文で)ください。
  2. request構成オブジェクトとコールバックの2つの引数を取ります。
  3. db.createDbQuery ブロッキングメソッドである必要があります。そうでない場合、作成する匿名オブジェクトには適切な値がありません。
  4. requestその構成値を使用し、ある種の非ブロッキングI / O要求を行い、後で指定したコールバック関数を呼び出します。つまり、そのrequest呼び出しの直後のコードは、指定したコールバックが実行される前に実行されます。
  5. しばらくして、リクエストデータが返され、Node.jsのイベントループがライブラリの登録済みイベントハンドラーにデータを提供します(これは直接コールバックである場合とそうでない場合があります。何かを実行して、後でイベントハンドラーを呼び出すことができます)。 、あなたは知らないか、本当に気にしません)。
  6. 次に、関数は、失敗した場合にエラーをスローするいくつかのチェックを実行し、最後に、実行の論理ストリームを実行doneして続行するスコープ内の関数(別の場所で定義されている)を呼び出します。
于 2012-06-05T19:16:49.797 に答える