Haxe - 如何为 Flash 目标实现异步等待
Haxe - How do you implement async await for Flash Targets
我目前有这个代码:
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 处等待,而 returns 来自函数。我怎样才能使 @await 实际上强制执行并在函数外部停止 运行ning 直到值从异步调用中解析出来?
Lib used: https://github.com/proletariatgames/haxe-continuation
您是如何使用 fetch
功能的?
我想你应该给它一个回调:
FileSystem.fetch(url, function(result) trace(result));
fetch
调用本身应该 return 立即,因为它是异步的,结果将传递给回调。
我认为不可能在获取调用时制作闪存块。
你真的不能。从这个意义上说,您调用 fetchText()
的函数永远不会 "wait"。
但是根据 "haxe-continuation" 的文档,它会将 @await FileSystem.fetchText()
表达式之后的所有内容放入一个新函数中,该函数将作为 fetchText()
的 callback
参数传递].所以在代码中它有点像在等待 "looks"。
根据文档,您必须确保将 @async
放在使用 fetchText()
的函数前面。据此,这样的事情应该有效(未经测试):
@async function someFunction(): Void {
var result1 = @await FileSystem.fetchText(someUrl);
var result2 = @await FileSystem.fetchText(anotherUrl);
trace(result1);
trace(result2);
}
函数末尾的 2 条跟踪应该在获取 result1
和 result2
之后发生,即使 someFunction()
实际上已经在跟踪之前返回。
查看调用 fetchText()
的代码可能会有所帮助。
我目前有这个代码:
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 处等待,而 returns 来自函数。我怎样才能使 @await 实际上强制执行并在函数外部停止 运行ning 直到值从异步调用中解析出来?
Lib used: https://github.com/proletariatgames/haxe-continuation
您是如何使用 fetch
功能的?
我想你应该给它一个回调:
FileSystem.fetch(url, function(result) trace(result));
fetch
调用本身应该 return 立即,因为它是异步的,结果将传递给回调。
我认为不可能在获取调用时制作闪存块。
你真的不能。从这个意义上说,您调用 fetchText()
的函数永远不会 "wait"。
但是根据 "haxe-continuation" 的文档,它会将 @await FileSystem.fetchText()
表达式之后的所有内容放入一个新函数中,该函数将作为 fetchText()
的 callback
参数传递].所以在代码中它有点像在等待 "looks"。
根据文档,您必须确保将 @async
放在使用 fetchText()
的函数前面。据此,这样的事情应该有效(未经测试):
@async function someFunction(): Void {
var result1 = @await FileSystem.fetchText(someUrl);
var result2 = @await FileSystem.fetchText(anotherUrl);
trace(result1);
trace(result2);
}
函数末尾的 2 条跟踪应该在获取 result1
和 result2
之后发生,即使 someFunction()
实际上已经在跟踪之前返回。
查看调用 fetchText()
的代码可能会有所帮助。