0

次のプログラムを作成して、node.js での非同期呼び出し/コールバックを理解しようとしましたが、代わりにさらに多くの質問がありました。

var z = 0

// define our function with the callback argument
function some_function(arg1, arg2, callback) {
    // this generates a random number between
    // arg1 and arg2
    var my_number = Math.ceil(Math.random() *
        (arg1 - arg2) + arg2);
    // then we're done, so we'll call the callback and
    // pass our result
    callback(my_number);
}

// call the function - callback 1
some_function(5, 15, function(num) {
    // this anonymous function will run when the
    // callback is called
        z = 1;
        console.log("callback 1 called! " + num + " z= " + z);
});

// call the function - callback 2
some_function(20, 25, function(num) {
    // this anonymous function will run when the
    // callback is called
    var x=3000;
    z = 2;
    setTimeout(function() {
        console.log("callback 2 called! " + num + "-> but waited " + x + " z= " + z);
        }
    ,x);
});

// call the function - callback 3
some_function(30, 35, function(num) {
    // this anonymous function will run when the
    // callback is called
    var x=5000;
    z = 3;
    setTimeout(console.log("callback 3 called! " + num + "-> but waited " + x + " z= " + z), x);
});

//callback function for callback 4
function callback_function(my_num) {
    z = 4;
    console.log("callback 4 called! " +  "-> but waited " + " z= " + z);
}

// call the function - callback 4
some_function(40, 45, function(num) {
    // this anonymous function will run when the
    // callback is called
    var x=6000;
    setTimeout(callback_function, x);
});

そして、ここに私が得る出力があります:

node callback_test.js 
callback 1 called! 13 z= 1
callback 3 called! 35-> but waited 5000 z= 3
callback 4 called! -> but waited  z= 4
callback 2 called! 25-> but waited 3000 z= 4

私の質問は次のとおりです。

  1. 私が理解していることから、完了時にのみ実行するコールバック-2とは対照的に、コールバック-3はすぐにconsole.logステートメントを実行するということです-それは正しいですか? そして、私が理解するのを助けるために、それはなぜですか?setTimeoutsetTimeout

  2. callback-4では、setTimeoutステートメント用に別のコールバック関数を作成しました。その関数 ( callback_function) にはパラメータがありますmy_num。上記のように実行すると、コールバックとして機能しますが、このようsetTimeout(callback_function(num), x);に実行するとすぐに実行されます-なぜこれが起こるのですか?

  3. これは質問 2 に関連しています。in callback-4setTimeout(callback_function, x);から、で定義されているように引数を渡すにはどうすればよいですか?callback_functionfunction callback_function(my_num) {...

4

1 に答える 1