2017-07-03 13 views
3

をターゲットするために待つ私は現在、このコードを持っている:私はそれを実行しようとすると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; 
} 
} 

、それはのawaitで待機、および関数からリターンしません。どのようにして@awaitを実際に実行させ、値が非同期呼び出しから解決されるまで関数の外部で実行を停止するには?

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

答えて

3

あなたは本当にできません。 fetchText()と呼ぶ関数は、その意味で決して「待つ」ことはありません。

しかし「haXeの継続」のマニュアルに従って、それはfetchText()callbackパラメータとして渡される新しい機能、にあなたの@await FileSystem.fetchText()発現後にすべてを入れます。だから、コードでは、それは待っているような "見た目"のようなものです。

文書によれば、fetchText()を使用する関数の前に@asyncを置くことを確認する必要があります。このようなこと何かによると(未テスト)動作するはずです:

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

result1result2someFunction()が実際にすでにトレースの前に戻っていても、フェッチされた後、関数の最後で2つのトレースが起こるはず。

コードfetchText()を参照すると役立つ場合があります。

1

どのようfetch機能を使用しましたか?

私はあなたがそれにコールバックを置く必要があるとします FileSystem.fetch(url, function(result) trace(result));

それは非同期で、結果はコールバックに渡されますので、fetchコール自体は、すぐに返す必要があります。

フェッチコールでフラッシュブロックを作成することはできません。

+0

これはその使用方法です。私はコールバックを捨てることを望んでいました。 – seang

+0

私はあなたの質問を理解していません。 '@ await'で' fetchText'を呼び出すと、すでにこれを行っています。 – KevinResoL

関連する問題