QA@IT
«質問へ戻る

質問を投稿

setTimeoutで0msを指定するイディオムの意味は?

あるJavaScriptのコード ( realtime-cube ) を眺めていたら、以下のような箇所がありました。

  setTimeout(function() {
    updateForRealTimeDoneInitializing();
    setTimeout(function() {
      updateCollaborators();
      setTimeout(function() {
        initCube();
      }.bind(this), 0)
    }.bind(this), 0);
  }.bind(this), 0);
}

分からないところがあるので、どなたか教えていただけませんでしょうか。

  1. setTimeout(someFunction, 0) というイディオムの意味は?
  2. なぜsetTimeoutはネストしているのか?

いまの私の理解では、ここで呼び出している初期化ぽいの3つの関数は、それなりに(通信系の待ちなどがあって?)時間がかかることもあるので、その処理が終わるのを待たずに処理を進めるためのイディオムなのかなというところです。

非同期で処理を進めるにしても、ネストしておくことで、

    updateForRealTimeDoneInitializing();
         
      updateCollaborators();
         
        initCube();

と確実に上の関数から戻ってきたことを保証できる、ということかなと想像していますが、それで合ってますでしょうか?

良く分かってないのですが、もしかしてこの辺は promise とか deferred といったパターンが使えるライブラリなら、スッキリ書けるものでしょうか?

あるJavaScriptのコード ( [realtime-cube](https://github.com/googledrive/realtime-cube/) ) を眺めていたら、以下のような箇所がありました。

~~~javascript
  setTimeout(function() {
    updateForRealTimeDoneInitializing();
    setTimeout(function() {
      updateCollaborators();
      setTimeout(function() {
        initCube();
      }.bind(this), 0)
    }.bind(this), 0);
  }.bind(this), 0);
}
~~~

分からないところがあるので、どなたか教えていただけませんでしょうか。

1. setTimeout(someFunction, 0) というイディオムの意味は?
2. なぜsetTimeoutはネストしているのか?

いまの私の理解では、ここで呼び出している初期化ぽいの3つの関数は、それなりに(通信系の待ちなどがあって?)時間がかかることもあるので、その処理が終わるのを待たずに処理を進めるためのイディオムなのかなというところです。

非同期で処理を進めるにしても、ネストしておくことで、

~~~javascript
    updateForRealTimeDoneInitializing();
         ↓
      updateCollaborators();
         ↓
        initCube();
~~~

と確実に上の関数から戻ってきたことを保証できる、ということかなと想像していますが、それで合ってますでしょうか?

良く分かってないのですが、もしかしてこの辺は promise とか deferred といったパターンが使えるライブラリなら、スッキリ書けるものでしょうか?