« メッセージキュー事始め in Perl - コマンドラインクライアントを作ってみた | メイン | djbdns にパッチをあてて Anti-DNS Pinning 対策 »

2007年11月08日

Re: for 文を setTimeout に変換する

 for 文を setTimeout に変換する - IT戦記の件。おもしろい。自分だったらこう書くかなと思いました。

function timeout_for(f1, f2, f3, fe) {
  var i = typeof f1 === 'function' ? f1() : f1;
  var rep = function () {
    if (typeof f2 === 'function' ? f2(i) : (i < f2)) {
      setTimeout(
        function () {
          fe(i);
          i = typeof f3 == 'function' ? f3(i): i + 1;
          rep();
        },
        10);
    }
  };
  rep();
}

簡単な使い方 (for (i = 0; i < 3; i++) に相当)

timeout_for(
  0, 3, 1,
  function (i) {
    alert(i);
  });

条件をコールバックで設定

timeout_for(
  function () { return 0; },
  function (i) { return i < 3; },
  function (i) { return i++; },
  function (i) {
    alert(i);
  });

変数は外部で保持しても良い

var i = 0;
timeout_for(
  function () {},
  function () { return i < 3; },
  function () { i++ },
  function () {
    alert(i);
  });

もちろんネストも可能

timeout_for(
  0, 3, 1,
  function (i) {
    timeout_for(
      1, 4, 1,
      function (j) {
        alert(i + ',' + j);
      });
  });

あとは、同一のインターフェイスをもつ非timeout版の実装を用意しておいて、切り替えて使うとか。

function ordinal_for(f1, f2, f3, fe) {
  for (
    var i = typeof f1 == 'function' ? f1() : f1;
    typeof f2 === 'function' ? f2(i) : (i < f2);
    i = typeof f3 === 'function' ? f3(i) : i + 1) {
    fe(i);
  }
}

timeout_for(0, 3, 1, function (i) { alert(i); });
ordinal_for(0, 3, 1, function (i) { alert(i); });

投稿者 kazuho : 2007年11月08日 16:19 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1636

このリストは、次のエントリーを参照しています: Re: for 文を setTimeout に変換する:

» [javascript][async]ループをsetTimeoutでまわす、Afrous版 from snippets from shinichitomita’s journal
for 文を setTimeout に変換する - IT戦記 Kazuho@Cybozu Labs: Re: for 文を setTimeout に変換... [続きを読む]

トラックバック時刻: 2007年11月08日 21:36

» javascript - setTimeout()化とネスト from 404 Blog Not Found
amachangの例題の場合もそうだが、これには一つ問題がある。 Kazuho@Cybozu Labs: Re: for 文を setTimeout に... [続きを読む]

トラックバック時刻: 2007年11月09日 23:22