2

コールバックを受け取り、関数の実行後にそれを呼び出す関数を書きたいと思います。

かんたんだよ:

var callback = function (ref) {
    var i = 1337;
    while (i--) {
        console.log(ref, 'callback');
    }
};

var someFoo = function (ref, callback) {
    console.log(ref, 'self');

    callback(ref);
}

someFoo('one', callback); // 1
someFoo('two', callback); // 2

しかし、ここで私はこの問題に直面しています: まずsomeFooオールバックが終了するまで呼び出しがブロックされます。つまり、このコードはこれと同等です (各関数が終了するまでブロックします)。

someFoo('one');
callback('one');
someFoo('two');
callback('two');

ここで質問: コールバック呼び出しを非同期にする方法は?

4

2 に答える 2

2

ブラウザーに実装されている JavaScript はシングルスレッドであるため、実際の非同期呼び出しを行うことはできません。あなたができることは、それを近似するために次のようなものです:

setTimeout(function() {
    callback(ref);
}, 1000);

1000 はミリ秒単位の 1 秒です (必要に応じてさらに遅延します)。ただし、シングルスレッドであるため、コールバックは実行中の他のコードを引き続きブロックします。

新しいブラウザはWeb ワーカーをサポートしていますが、スレッド化を近似するために Web ワーカーを使用すると、多くの古いブラウザでは動作しないコードが残り、新しいブラウザのすべてが現在でも完全な仕様をサポートしているわけではありません。

于 2013-07-19T15:58:39.537 に答える