2017-07-03 50 views
3

我現在有這樣的代碼:HAXE - 如何實現異步等待對Flash瞄準

package sage.sys; 

import com.dongxiguo.continuation.Async; 

#if flash 
import flash.net.URLLoader; 
import flash.net.URLRequest; 
import flash.net.URLLoaderDataFormat; 
import flash.events.Event; 
import flash.events.IOErrorEvent; 
import flash.events.SecurityErrorEvent; 
#end 

class FileSystem implements Async 
{ 
    public static function fetchText(url:String, callback:String->Void) : Void 
    { 
     var urlLoader = new URLLoader(); 
     var onLoaderError = function(e : Event) : Void { 
     callback(e.type); 
    }; 

    urlLoader.addEventListener(Event.COMPLETE, function(_) : Void { 
     callback(Std.string(urlLoader.data)); 
    }); 

    urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onLoaderError); 
    urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onLoaderError); 

    try { 
     urlLoader.dataFormat = URLLoaderDataFormat.TEXT; 
     urlLoader.load(new URLRequest(url)); 
    } 
    catch (e : Dynamic) 
    { 
     callback(Std.string(e)); 
    } 
} 

@async 
public static function fetch(url:String):String 
{ 
    var result = @await fetchText(url); 
    return result; 
} 
} 

當我嘗試運行它,它不會在等待的await,並從函數返回。我怎樣才能使@await實際上自己執行,並停止在函數外部運行,直到值從異步調用中解析出來爲止?

Lib used: https://github.com/proletariatgames/haxe-continuation

回答

3

你不可能真的。在這個意義上,你稱之爲fetchText()的功能永遠不會「等待」。

然而根據「haXe的延續」的文檔,它會把一切你@await FileSystem.fetchText()表達後,進入一個新的功能,這將作爲fetchText()callback參數傳遞。所以在代碼中,它看起來像是在等待。

根據文檔,您必須確保您將@async放在使用fetchText()的函數前面。根據這樣的事情應該工作(未經測試):

@async function someFunction(): Void { 
    var result1 = @await FileSystem.fetchText(someUrl); 
    var result2 = @await FileSystem.fetchText(anotherUrl); 
    trace(result1); 
    trace(result2); 
} 

的2個痕跡在函數的結束應該發生後result1result2是牽強,即使someFunction()實際的痕跡之前就已經回來了。

看到代碼調用fetchText()可能會有幫助。

1

你是如何使用fetch功能?

我想你應該把一個回調到它: FileSystem.fetch(url, function(result) trace(result));

fetch調用本身應立即返回,因爲它是異步,結果會被傳遞給回調。

我不認爲有可能在fetch調用中創建flash塊。

+0

這就是它的使用方式。我希望取消回調。 – seang

+0

我不明白你的問題。當你用'@ await'調用'fetchText'時,你已經完成了 – KevinResoL