ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   ActionScript 3.0
     callLater関数について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
mi777ck
投稿日時: 2010-10-13 10:03
常連さん
登録日: 2010-5-29
居住地:
投稿: 34
callLater関数について
お世話になります。
callLaterについて質問させてください。

Func関数を実行した場合に、callLaterを使って呼び出した
testMethodより前にWebサービスのイベントが来ることは
ないと保証できますでしょうか。

動作確認した限りではupdateDataで呼び指すWebサービスは
関数が終了してアイドル状態にならないと実際には
呼び出されていませんでした。

自分的には以下の呼出順の認識でいます。
testMethod → updateData → testMethodを抜ける
→ Webサービス呼出 → testMethod → loadHandler

private var svc:WebService = new WebService();

public function Func():void
{
callLater(testMethod);
updateData();
}

private function testMethod():void
{
trace("call testMethod");
}

private function updateData():void
{
svc.addEventListener(LoadEvent.LOAD, loadlHandler);
svc.addEventListener(FaultEvent.FAULT, faultHandler);

// Webサービス呼出
var url = "http://……………" // URL
svc.loadWSDL(url);
}

// Webサービスのイベント
private function loadHandler( event:LoadEvent ):void
{
trace("call loadHandler");
}

アドバイスいただけると助かります。

よろしくお願いします。
arkw
投稿日時: 2010-10-13 10:21
管理人
登録日: 2006-1-10
居住地:
投稿: 167
Re: callLater関数について

Webサービスの呼び出しは即実行されず次のフレームの先頭ぐらいで実行されます。そして、Loadイベントが発生するまでの時間は環境に依存するので必ず決まっていません。

次に、callLaterは基本的に次のフレームで実行されるので
実行されるまでの時間はある程度分かります。

よって、WebサービスのLoadイベント発生が不確定なので、保証はできないかと思います。

また、callLaterの利用は避けた方がいいかと思います。



----------------
AKABANA / クラスメソッド株式会社 プリンシパル

fxug@akabana.net
http://www.akabana.net/
Flex/AIR 技術トレーニング 承り中

mi777ck
投稿日時: 2010-10-13 10:36
常連さん
登録日: 2010-5-29
居住地:
投稿: 34
Re: callLater関数について
回答していただきありがとうございます。

たとえばですが、callLaterで呼び出す個所をTimerを
使って呼び出すと(1ミリ秒後とかに設定して)

testMethod → updateData → testMethodを抜ける
→ Webサービス呼出 → testMethod → loadHandler

の順に呼ばれるようになると思われますでしょうか?

kacchan6
投稿日時: 2010-10-13 11:56
ご主人様
登録日: 2009-10-15
居住地:
投稿: 167
Re: callLater関数について
Timerは書いたミリ秒後に必ず実行されるわけではありません。
あくまでベストエフォートでスケジューリングされます。CPU負荷が高い場合には遅延します。

またTimerは、Flash10.1から1000/60ミリ秒刻でスケジューリングされます。
Flash10.0とは全く動作が変わります。

callLaterにせよsetTimeoutにせよ、非同期を複数呼び出した場合、
実行順は常に保証されない前提でコードを書いた方が何かと安全です。

例えばWebServiceの実装があるバージョンから、
「一定の条件を満たしている場合、キャッシュされているデータを即時に返す」
のような実装になり、非同期ではなく同期でロード完了のイベントをディスパッチするようになった場合、破綻します。


以下は余談になります。

callLaterはrenderイベントとenterFrameイベントをトリガーに動きますので、
MouseEvent/TimerEventのupdateAfterEventが呼ばれると、フレームに関係なく呼び出されます。
mi777ck
投稿日時: 2010-10-13 16:27
常連さん
登録日: 2010-5-29
居住地:
投稿: 34
Re: callLater関数について
詳しく説明していただきありがとうございました。
とても参考になりました。


スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を