2010-01-14 127 views
0

我一直在思考的一個小問題,我有一個從網址加載文本的類作爲同步時間的方法。AS3:共享對象問題

swf文件可以在同一頁面多次,但我希望它檢查是否有一個瑞士法郎同步,如果是的話,等待它完成並加載其sync'd值(而不是查詢url本身),以便它們都被同步到相同的值(要加載的第一個swf文件)。

我想這個使用共享對象,這看起來有點像這樣(摘錄):

public function sync():void 
    { 
     sharedObject = SharedObject.getLocal("synctime", "/"); 
     trace(sharedObject.data.startOfRequest, sharedObject.data.endTime); 
     if (((new Date().getTime() - 10000) < sharedObject.data.startOfRequest) && (sharedObject.data.endTime !== undefined)) 
     { 
      loadUTCFromSharedObject(); 
     } 
     else if (((new Date().getTime() - 10000) < sharedObject.data.startOfRequest) && (sharedObject.data.endTime == undefined)) 
     { 
      timer.addEventListener(TimerEvent.TIMER, loadUTCFromSharedObject); 
      timer.addEventListener(TimerEvent.TIMER_COMPLETE, startSync); 
      timer.start(); 
     } else { 
      startSync() 
     } 
    } 

    private function startSync(e:Event = null) 
    { 
     var syncRequest:URLRequest = new URLRequest(TIMEURL + "?cb=" + Math.random()); 
     var syncTimeLoader:URLLoader = new URLLoader(); 

     syncTimeLoader.dataFormat = URLLoaderDataFormat.TEXT; 
     syncTimeLoader.addEventListener(Event.COMPLETE, syncTimeComplete); 
     syncTimeLoader.addEventListener(IOErrorEvent.IO_ERROR, syncTimeFailed); 

     sharedObject.clear(); 
     startOfRequest = new Date(); 
     sharedObject.data.startOfRequest = startOfRequest.getTime(); 
     sharedObject.flush(); 
     syncTimeLoader.load(syncRequest); 
    } 
    private function loadUTCFromSharedObject(e:Event = null):void 
    { 
     var sharedObjectCheck:SharedObject = SharedObject.getLocal("synctime", "/"); 

     trace (sharedObject.data.endTime, sharedObjectCheck.data.endTime); 
     if (sharedObject.data.endTime !== undefined) 
     { 
      timer.removeEventListener(TimerEvent.TIMER, loadUTCFromSharedObject); 
      timer.removeEventListener(TimerEvent.TIMER_COMPLETE, startSync); 
      dispatchEvent(new LoadUTCTimeEvent(LoadUTCTimeEvent.SYNC_COMPLETE, null, null, sharedObject, true)); 
      trace(sharedObject.data.UTCOffset); 
     } 
    } 
    private function syncTimeComplete(event:Event):void 
    {   
     var loadedText:URLLoader = URLLoader(event.target); 
     dispatchEvent(new LoadUTCTimeEvent(LoadUTCTimeEvent.SYNC_COMPLETE, loadedText.data, startOfRequest, sharedObject, false)); 

    } 

事件調度:

public function LoadUTCTimeEvent(eventStatus:String, timeString:String = null, startOfRequest:Date = null, sharedObject:SharedObject = null, loadFromSharedObject:Boolean = false):void 
    { 
     super(eventStatus); 
     if (eventStatus == SYNC_COMPLETE) { 
      if (loadFromSharedObject == true) { 
       time = sharedObject.data.syncTime; 
       UTCOffset = sharedObject.data.UTCOffset; 
      } 
      else 
      { 
       //...snip....// 
       sharedObject.data.UTCOffset = UTCOffset; 
       sharedObject.data.syncTime = time; 
       sharedObject.data.endTime = curDate.getTime(); 
       sharedObject.flush(1000); 
      } 

     } 
    } 

我得到的問題是,第一SWF創建sharedobject很好,但第二個將endTime作爲undefined讀取,除非我刷新頁面(即它不接收實時更改)。這種方法不可行嗎,我應該再試一次嗎?

在此先感謝。

編輯:決定將另一個棧來解釋多一點:(as3) Sync data between 3 or more identical flash objects on the same page

回答

0

你可以調用javascript函數做鎖定,如果你堅持這個解決方案

+0

沒有我想嘗試的東西,想保持在Flash文件中的控制,沒有任何其他的外部interation。 – Andy 2010-01-14 12:11:27

0

好了,可以使用localConnection

通常,您不應該使用本地SharedObjects來同步事物。 flush()命令從來沒有以你想要的方式工作。

+0

我會放棄它,謝謝。 – Andy 2010-01-18 07:54:19

+0

本地連接也沒有太好的工作,有更多的一個開放的連接有一些問題:( – Andy 2010-02-01 10:41:06

+0

如果你有這個問題,你需要管理多個打開的連接與生成的ID根據時間戳記(粒度足夠小,所以你可以考慮加載時間),或者實現某種跟蹤系統..例如,用給定組中多少個swf的長度來管理一個數組......每當一部電影出現時就增加數組的相應部分它的類型被加載,只有類似索引實例能夠相互通信;或者,爲頁面上的每部電影生成一個flashvar跟蹤ID,只有具有相同ID的swf才能通話 – michael 2010-02-01 19:27:16