Home > Latest topics

Latest topics > yieldをwait代わりに使っちゃっていいのかなー

宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能! シス管系女子って何!? - 「シス管系女子」特設サイト

yieldをwait代わりに使っちゃっていいのかなー - Feb 16, 2007

MozLabの一機能の単体テスト用ツールMozUnitではasync型のテストケースを書くことができる、というのは前にここでも書いたんだけど、使い勝手の悪いポイント?が一つある。それは、テストケースの中で、ある処理が終わってから次の処理に進むといったことが簡単にはできないこと。

現状の仕様では、

  1. 共通の前処理(処理待ちできる)
  2. テストケース1(処理待ちできない)
  3. 共通の後処理(処理待ちできない)
  4. 共通の前処理(処理待ちできる)
  5. テストケース2(処理待ちできない)
  6. 共通の後処理(処理待ちできない)
  7. 共通の前処理(処理待ちできる)
  8. テストケース3(処理待ちできない)
  9. ...

という書き方しかできなくて、各テストケースの中でコールバック関数を使って準備が整うのを待つという使い方はできない。一般的な意味での単体テストというのがどうある「べき」なのかは知らないけど、やりたいこととしては、

  1. 共通の前処理(処理待ちできる)
  2. テストケース1(処理待ちできる)
  3. 共通の後処理(処理待ちできない)
  4. 共通の前処理(処理待ちできる)
  5. テストケース2(処理待ちできる)
  6. 共通の後処理(処理待ちできない)
  7. 共通の前処理(処理待ちできる)
  8. テストケース3(処理待ちできる)
  9. ...

の方が便利ですよね? ね?

んでscript.aculo.usユニットテストの機能ではwaitという機能を使って処理待ちができるそうだから、MozUnitステでscript.aculo.usを拡張機能の開発でも使えるようにせよ!という指令が須藤さんから下ったのだけれども。

なんか仕様があちこち違うから今までMozLabベースで作ってた物をこれ用にするにはscript.aculo.usのソースもガッツリ読まなきゃいけないっぽいし、どうもscript.aculo.usは複数のテストが同時に動くことを想定していなさそうな雰囲気だったので、MozReplみたいな機能を使って同時に複数人でテストするようなことは難しいっぽかった(そんな事ほんとにやるのかどうかはさておき)ので、新しいこと覚えるよりは今までの知識がそのまま使えた方が僕が楽だと思った。

ということでMozUnitのTescCaseクラスの定義をゴニョゴニョと書き換えて、JavaScript 1.7のジェネレータを応用し、テストケースの中で yield 5000; とか書くとそこで指定時間(ここでは5000ミリ秒=5秒)待ってから次の処理に進むということができるようにしてみた。テストケースの実行結果の返り値を見て、 [object Generator]である場合は、StopIteration例外が出るまでタイマー使って何度もnext()を実行して、それが済んでから次に処理を進めるようにした次第です。

……ということなんだけど、yieldってこんな使い方しちゃっていいのかしらん? yield(生産)って書いてるのに何も生産しとらんし。

分類:Web技術 > JavaScript, , , , , 時刻:03:43 | Comments/Trackbacks (3) | Edit

Comments/Trackbacks

yield

「清算」じゃなくて「譲る」方だと思う。
関数を途中で止めて親環境に処理を「譲る」のが yield だと思うので、正解じゃないですか?

Commented by mal at 2007/02/18 (Sun) 04:04:49

no title

なるほど。そういう意味もあったんですね。
「ジェネレータ関数」とかなんとかいう言葉から、てっきり、「生産」の方の意味だけだと思い込んでました。

Commented by Piro at 2007/02/18 (Sun) 05:18:11

JavaScript/1.7 で協調的マルチスレッド

 JavaScript/1.7 の話なので Firefox 限定です。以前、  ...

Trackback from Kazuho@Cybozu Labs at 2007/05/25 (Fri) 13:51:54

TrackBack ping me at


の末尾に2020年11月30日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2007-02-16_yield.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。

Post a comment

writeback message: Ready to post a comment.

2020年11月30日時点の日本の首相のファミリーネーム(ひらがなで回答)

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のコメント

最近のつぶやき