3

Javascript の非同期性について質問があります。私が調べた限りでは、Javascript は 1 つのスレッドしか使用しないが、非同期でイベントを処理できるということです。

次のコードがあります。

game.next();
this.autopilot();

ここで、関数が呼び出されるgame.next前に関数を終了する必要があります。this.autopilotJavascript は実際にgame.next終了するまで待機しますか、それともすぐに実行this.autopilotされますか?

もしそうなら、コールバックは問題を解決しますか?

コールバックを伴う次の関数:

Game.prototype.next = function(callback) {
    // Code

    if(callback !== undefined) {
        callback();
    }
};

そのコールバックを使用する呼び出し関数:

game.next(function() {
    this.autopilot();
}.bind(this));
4

2 に答える 2

4

コードでは、呼び出されるgame.next()前に戻る必要があります。this.autopilot()

ただし、game.next()非同期プロセス (Ajax 呼び出しなど) を開始し、プロセスが完了する前に戻る可能性があります。そのプロセスが完了するまでの実行を延期したい場合this.autopilot()は、何らかのコールバック メカニズムが必要になります。game.next()コールバック関数を非同期処理が行われているものに渡す必要があります。(質問で示唆しているように、戻る直前にコールバックを実行することは、非同期プロセスが完了する前にも発生するため、間違っています。)

于 2013-07-18T19:19:08.637 に答える
2

はい、コールバックを使用して のgame.next()前に終了することを確認できますthis.autopilot()。ただし、トリックがあります。コードの後に​​コールバックを貼り付けることはできません。コールバックを実装する必要があるかどうかは、game.next()関数が非同期かどうかによって異なります。

コールバックを必要としない同期関数の例:

function next() {
   Game.x += 1;
}

実行順序を維持するためにコールバックが必要な非同期関数の例:

function next(callback) {
   window.setTimeout(function() {
       if(callback !== undefined) { /* etc. */ }
   }, 0);
}
于 2013-07-18T19:19:07.807 に答える