gpt4 book ai didi

asynchronous - Haxe - 如何为 Flash 目标实现异步等待

转载 作者:行者123 更新时间:2023-12-04 04:54:05 28 4
gpt4 key购买 nike

我目前有这段代码:

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 实际上强制执行并停止在函数外运行,直到值从异步调用中解析出来?

使用的库:https://github.com/proletariatgames/haxe-continuation

最佳答案

你真的不能。在这个意义上,您调用 fetchText() 的函数永远不会“等待”。

但是根据“haxe-continuation”的文档,它会将您的@await FileSystem.fetchText() 表达式之后的所有内容放入一个新函数中,该函数将作为回调传递 fetchText() 的参数。所以在代码中它“看起来”像是在等待。

根据文档,您必须确保将 @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() 的代码可能会有所帮助。

关于asynchronous - Haxe - 如何为 Flash 目标实现异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44894344/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com