2017-07-03 1 views
3

ich zur Zeit diesen Code habe:Haxe - Wie Sie async für Flash implementieren Sie erwarten Ziele

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

Wenn ich versuche, es zu laufen, es wartet nicht auf der Warte und kehrt aus der Funktion. Wie kann ich erreichen, dass sich @dait tatsächlich selbst durchsetzt und nicht mehr außerhalb der Funktion läuft, bis der Wert vom asynchronen Aufruf aufgelöst wird?

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

Antwort

3

Sie können nicht wirklich. Die Funktion, in der Sie fetchText() aufrufen, wird niemals in diesem Sinne "warten".

nach jedoch in der Dokumentation „haxe-Fortsetzung“ wird es alles nach Ihrem @await FileSystem.fetchText() Ausdruck in eine neue Funktion setzen, die als callback Parameter von fetchText() übergeben wird. Im Code sieht es so aus, als würde es warten.

Entsprechend der Dokumentation müssen Sie sicherstellen, dass Sie @async vor die Funktion setzen, die fetchText() verwendet. Nach dieser etwas wie dies sollte (ungetestet) arbeiten:

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

Die zwei Spuren am Ende der Funktion sollten geschehen, nachdem result1 und result2 geholt werden, obwohl someFunction() zurück tatsächlich vor den Spuren bereits.

Es könnte hilfreich sein, Ihren Code zu sehen, der fetchText() aufruft.

1

Wie Sie die fetch Funktion genutzt haben?

Ich nehme an, Sie einen Rückruf setzen sollten: FileSystem.fetch(url, function(result) trace(result));

Der fetch Anruf selbst sollte sofort zurück, weil es async ist und das Ergebnis wird an den Rückruf übergeben werden.

Ich glaube nicht, dass es möglich ist, Flash-Block beim Abruf zu machen.

+0

So wurde es verwendet. Ich hatte gehofft, den Rückruf rückgängig zu machen. – seang

+0

Ich verstehe deine Frage nicht. Das hast du schon gemacht, als du 'fetchText' mit' @warte' aufgerufen hast – KevinResoL