1

関数を非同期で実行しようとしていますが、最も速い関数を受け取るのではなく、呼び出す順序で常に結果を受け取ります。

これは一例です。期待される結果は、最後に呼び出されても最初の 100 を出力することです。

function f1(callback){
    i = 0;
    for (i;i< 100;i++){

    }

    if (i == 100){
        return callback(i);
    }
}

function f2(callback){
    i = 0;
    for (i;i< 99999999999;i++){

    }

    if (i == 99999999999){
        return callback(i);
    }
}

f2(function(i){
    console.log(i);
})

f1(function(i){
    console.log(i);
});
4

1 に答える 1

1

ノード (および一般的な JavaScript) では、関数はデフォルトでは非同期ではありません。

上記のコードでは、javascript のイベント ループに制御を渡していません。各関数を呼び出すと、終了するまで for ループを実行してからコールバックします。これが、出力をそのまま表示している理由です。

ノードの非同期性は、IO の実行を開始するか、意図的に VM に制御を譲り、イベント ループから他のイベントを処理する機会を VM に与えるときに開始されます。

上記のコードをテストのために非同期で実行するには、次のようにします。

function f1(callback){
    setTimeout(callback('f1'), 100);
}
function f2(callback){
    setTimeout(callback('f2'), 500);
}

f2(function(i){
    console.log(i);
})
f1(function(i){
    console.log(i);
});

setTimeout呼び出しは基本的に次のように述べています: 提供された関数を可能な限り n ミリ秒に近い値で呼び出します (ただし、それ以前ではありません)。ここでは基本的にスリープ ステートメントとして機能し、現在実行中のコードに制御を返します。

于 2013-08-18T14:53:48.857 に答える