1

このコードがブロックされる理由がわかりません。私はnodejs非同期関数を使用していますが、今はノンブロッキングプログラミングの本質とは何か、そしてそれらをどのように実装できるかを理解しようとしています。これは私が思っていた方法ですが、それでもブロックされています。

   var async_func = function(x, func) {
        func(x+5);
    };

    setTimeout( async_func(5, function(number) {
        for (var x = 0; x < 1000000000; x++) {;}
        console.log(number);
    }), 3000);

    console.log("done");
4

2 に答える 2

2

試す:

var async_func = function(x, func) {
    func(x+5);
};

setTimeout(function(){
    async_func(5, function(number) {
       console.log(number);
    });
}, 3000);

console.log("done");

(不要なものも削除しましたfor (var x = 0; x < 1000000000; x++) {;}

匿名関数またはヘルパー関数を作成せずに、setTimeoutで引数を使用して関数を呼び出すことはできません...(別の関数を設定せずに本当に実行したい場合は、以下の@Ianコメントを確認してください。)

関数に引数がない場合は実行できますsetTimeout(async_func, 3000);が、この場合は、無名関数を介して関数を呼び出す(または、これらの引数を使用して関数を呼び出す上記の呼び出し関数を宣言する)のが最善です。

于 2012-11-01T00:40:12.910 に答える
2

setTimeout()これは、引数を使用して関数を呼び出したい場所で関数参照を使用および渡すときによくある間違いです。このコード行:

setTimeout( async_func(5, function(number) {

すぐに実行async_func()し、その戻り結果(関数ではありません)をに渡しますがsetTimeout()、それはあなたが望むものではありません。関数参照をに渡したいsetTimeout()のでsetTimeout()、後で次のようにその関数を呼び出すことができます。

var async_func = function(x, func) {
    func(x+5);
};

setTimeout( function() {
    async_func(5, function(number) {
        for (var x = 0; x < 1000000000; x++) {;}
        console.log(number);
    });
}, 3000);

console.log("done");    

または、タイマーコールバック関数を引数のない独自の独立した関数にすることで、理解しやすくなる場合があります。

function async_func(x, func) {
    func(x+5);
}

function timer_func() {
    async_func(5, function(number) {
        for (var x = 0; x < 1000000000; x++) {;}
        console.log(number);
    });
}

setTimeout(timer_func, 3000);

console.log("done");    
于 2012-11-01T00:41:42.097 に答える