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

时间:2017-07-03 21:59:00

标签: asynchronous async-await haxe

我目前有这段代码:

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;
}
}

当我尝试运行它时,它不等待等待,并从函数返回。如何让@awa实际上强制执行并停止在函数外部运行,直到从异步调用中解析出值?

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

2 个答案:

答案 0 :(得分:3)

你真的不可能。您调用fetchText()的函数将永远不会等待"从那个意义上说。

然而根据" haxe-continuation"的文件。它会将@await FileSystem.fetchText()表达式之后的所有内容放入一个新函数中,该函数将作为callback的{​​{1}}参数传递。所以在代码中它看起来像#34;喜欢它在等待。

根据文档,您必须确保将fetchText()放在使用@async的函数前面。根据这样的事情应该工作(未经测试):

fetchText()

函数末尾的2条跟踪应该在获取@async function someFunction(): Void { var result1 = @await FileSystem.fetchText(someUrl); var result2 = @await FileSystem.fetchText(anotherUrl); trace(result1); trace(result2); } result1之后发生,即使result2实际上已经在跟踪之前返回了。

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

答案 1 :(得分:1)

您是如何使用QLabel功能的?

我想你应该给它回调一下: row['slink']

var href = row["slink"].trim().length > 0 ? row["slink"] : "javascript:alert('File Not Yet Available')" '<a href="'+href+'"><button type="button" class="btn btn-info " data-row-id="' + row.id + '">Download</buttn></a> '; 调用本身应立即返回,因为它是异步的,结果将传递给回调。

我不认为可以在提取电话中进行闪存阻止。