2015-10-06 47 views
1

回報我得到nullJSON.parse(...)reelarray爲空 - 的ActionScript

public function spin() 
{ 
    var decoded : Object; 
    trace("i am innnnnnn"); 
    var sendLoaders:URLLoader; 
    var sendRequests:URLRequest; 
    sendLoaders = new URLLoader(); 
    sendRequests = new URLRequest("http://localhost/getspinvalue/4"); 
    var difvar:Array = []; 

    sendLoaders.addEventListener(Event.COMPLETE, botCompleted); 
    sendLoaders.load(sendRequests); 
    function botCompleted(e:*) 
    { 
     decoded = JSON.parse(e.currentTarget.data); 
    } 
    trace(decoded); 
    return decoded.reelarray; 
} 

回答

0

好,sendLoaders.load()是一個異步事件,你的函數返回空值,因爲botCompleted()功能處理不當解僱當函數返回

您需要繼續執行的內部你botComplete功能(如果你需要每次旋轉(在做不同的事),你可以傳遞被執行的功能)

public function spin() {  
    var decoded : Object; 
    trace("i am innnnnnn"); 
    var sendLoaders:URLLoader; 
    var sendRequests:URLRequest; 
    sendLoaders = new URLLoader();  


    sendRequests = new URLRequest("http://localhost/getspinvalue/4"); 
    var difvar:Array = []; 

    sendLoaders.addEventListener(Event.COMPLETE, botCompleted);    
    sendLoaders.load(sendRequests);    
    trace("request sent") 
} 

function botCompleted(e:*) {           
    decoded = JSON.parse(e.currentTarget.data); 
    trace("data recieved:" + decoded) 
    //CONTINUE EXECUTION HERE 
} 
+0

我只想要tht的方法來返回值,所以我怎麼能改變我的代碼 – Venigalla

+0

當我打電話的旋轉方法,它應該返回我的解碼val,所以我怎麼能改變我的code.can你請幫助它.. – Venigalla

+0

好吧,這是不可能的。您可以使用Promise之類的技術來僞造您的代碼。但是仍然需要重寫你的代碼。 – leetwinski

0

URLLoader.load是一種異步方法,這意味着它產生一個加載URL的進程,並繼續執行spin。所以它立即返回一個值。稍後在滿足請求時執行botCompleted函數。類似的東西:

sendLoaders.load() 
return value 
botCompleted() 

所以你應該依靠botCompleted函數,而不是返回值。所有依賴於解碼結果的邏輯都應在botCompleted函數內觸發。

function botCompleted(e:Event):void { 
    decoded = JSON.parse(e.currentTarget.data); 
    handleDecodedResult(decoded); 
} 
+0

thanq ...我想我的旋轉方法來返回解碼值。我如何更改我的代碼。 – Venigalla

+0

這是不可能的。你需要重構你的代碼以異步工作。無論代碼依賴於spin()來返回解碼值,都不能依賴於spin()返回解碼值。或者你需要在'spin()'被調用之前移動JSON加載。或者你可以傳入一個回調函數到'spin()'來完成JSON處理。等等。 – Aaron

0

我希望我的spin方法返回解碼值。所以我怎樣才能改變 我的代碼。

這是不可能的。 JSON數據是異步加載的,但函數會同步返回。換句話說,spin()函數立即返回(像所有函數一樣),但URLLoader直到以後纔會完成。 botCompleted處理程序在您的return語句之前寫入並不重要,直到稍後它纔會被調用。這是事件處理程序的用途:處理異步事件。

你可以做的是傳遞迴調函數。例如:

function spin(callback:Function):void { 
    var loader:URLLoader = new URLLoader(); 
    // .. load 
    loader.addEventListener(Event.COMPLETE, complete); 
    function complete(e:Event):void { 
     var decoded:Object = JSON.parse(e.target.data); 
     callback(decoded); 
    } 
} 

現在你可以打電話給你的spin功能,並在您致電spin的背景下,這幾乎使它看起來同步傳遞一個匿名函數:

spin(function(data:Object):void { 
    trace(data); 
    // Do stuff with data here 
}); 
// Note: data is not available yet from here, only from inside the callback above 

這是一種常見練習(在AS3和JS中),though not without its pitfalls