JavaScriptからFlash内のコントロールに値を渡したりしている処理をテストしているのだが、値を設定しても思い通りの値にならない項目がある。コンボボックスのselectedIndexに値を設定しているはずなのに・・。

Alertで値を見ると、間違いなく正常な値を渡している。

しばらく放心状態を経て、気を取り直してポイントごとにAlertを埋め込む。気になるのは、値を設定していないにもかかわらずコンボボックスの値が選択されていることがあること。いつそれが行われるのか、追いかけていくと、実行中にFlashのコントロールに値を設定したことにより、Flashでイベントが発生し、そのイベントを受け取っているのではないか?と気づいた。
そこで、Flashからのイベントが起動されているかもAlertで確認すると、メインのJavaScript実行中(他のAlertを出している最中)にFlashからのイベントを受け取ってAlertを出した。そう、処理がパラレルに動いていたのだ。

原因さえ分かれば、あとは調整だ。
まず、初期処理中はイベントを実行しないように、フラグで制御するようにした。しかし、これでもダメであった。
そこで使ったのが JavaScriptのsetTimeour関数。この関数、どういう動きをするのか説明が難しいが、ちょっと書いてみると、setTimeout("[関数名]",[ミリ秒])で、ミリ秒後に、他の処理が動いていなければ、指定した関数名が動き出す、というもの。setTimeoutに後続の処理は、この処理の終了を待たずに流れていき、終わった頃に実行される。更に言うと、[ミリ秒]に0を指定しても無意味ではなく、とにかく「いったんお待ち」状態になるようだ。
フラグを初期処理が終わった状態にする処理を、このsetTimeoutを使ってちょっと保留させることで、イベントで呼ばれた処理を先に実行(でも、初期処理中だから終了するのだが)させることが可能になり、まっとうに動くようになった。

VBAなんかだとこのように流れることはない。今思いつく例外として、VBA内部だけであればモードレスフォームを使ったとき、くらいだろうか。外部プログラムを呼ぶ場合、例えばDOSの呼び出しなんかは非同期だったな、と思い出す。
そう考えれば今回は暴走なんかではない。JavaScriptから外部プログラムを制御をしているのだがら、非同期であることは当然考慮されていなければならなかったのだ。この後、類似のエラーがあるかもしれない。テスター仲間で情報を共有しておこうと思う。