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 条跟踪应该在获取 result1result2 之后发生,即使 someFunction() 实际上已经在跟踪之前返回。

查看调用 fetchText() 的代码可能会有所帮助。