From 18808764f9dea565eee1587654d620332f60bcf3 Mon Sep 17 00:00:00 2001 From: shmyga Date: Fri, 17 Jul 2015 21:27:20 +0300 Subject: [PATCH] use promise in loader --- haxelib.json | 1 + samples/02-loader/build.hxml | 1 + samples/02-loader/src/LoaderExample.hx | 8 +- src/main/haxework/gui/ImageView.hx | 2 +- src/main/haxework/net/BaseLoader.hx | 75 +++++++++---------- src/main/haxework/net/BaseMediaLoader.hx | 23 ------ src/main/haxework/net/BaseURLLoader.hx | 21 ++++-- src/main/haxework/net/BatchLoader.hx | 43 ++--------- src/main/haxework/net/ILoader.hx | 12 +-- src/main/haxework/net/ImageLoader.hx | 1 - src/main/haxework/net/JsonLoader.hx | 5 +- .../haxework/net/callback/AutoCallback.hx | 1 + src/main/haxework/net/callback/Callback.hx | 1 + src/main/haxework/net/callback/ICallback.hx | 1 + 14 files changed, 74 insertions(+), 121 deletions(-) diff --git a/haxelib.json b/haxelib.json index 77b9ffc..b166bf5 100755 --- a/haxelib.json +++ b/haxelib.json @@ -9,6 +9,7 @@ "contributors": ["shmyga"], "classPath": "src/main", "dependencies": { + "promhx": "", "openfl": "" } } diff --git a/samples/02-loader/build.hxml b/samples/02-loader/build.hxml index 566066b..e42934d 100755 --- a/samples/02-loader/build.hxml +++ b/samples/02-loader/build.hxml @@ -1,4 +1,5 @@ -cp src +-lib promhx -lib haxework -main LoaderExample.hx -swf-version 10.1 diff --git a/samples/02-loader/src/LoaderExample.hx b/samples/02-loader/src/LoaderExample.hx index 7097f82..15d981b 100755 --- a/samples/02-loader/src/LoaderExample.hx +++ b/samples/02-loader/src/LoaderExample.hx @@ -19,24 +19,24 @@ class LoaderExample { // Json trace("Json Request"); new JsonLoader().GET("http://umix.tv/channel/data2/renova.json") - .success(function(channel:Array) { + .then(function(channel:Array) { trace("Json Ok: " + channel.length); for (item in channel) { trace(item.id + ": " + item.message); } }) - .fail(function(error) { + .catchError(function(error) { trace(error); }); // Image trace("Image Request"); new ImageLoader().GET("http://umix.tv/channel/block/renova/1") - .success(function(image:BitmapData) { + .then(function(image:BitmapData) { trace("Image Ok: " + image.width + "x" + image.height); Lib.current.addChild(new Bitmap(image)); }) - .fail(function(error) { + .catchError(function(error) { trace(error); }); } diff --git a/src/main/haxework/gui/ImageView.hx b/src/main/haxework/gui/ImageView.hx index d66e626..a20b2ef 100755 --- a/src/main/haxework/gui/ImageView.hx +++ b/src/main/haxework/gui/ImageView.hx @@ -27,7 +27,7 @@ class ImageView extends SpriteView { private function set_imageUrl(value:String):String { if (imageUrl != value) { imageUrl = value; - new ImageLoader().GET(imageUrl).success(function(data) { + new ImageLoader().GET(imageUrl).then(function(data) { image = data; }); } diff --git a/src/main/haxework/net/BaseLoader.hx b/src/main/haxework/net/BaseLoader.hx index 5a54321..7070cdb 100755 --- a/src/main/haxework/net/BaseLoader.hx +++ b/src/main/haxework/net/BaseLoader.hx @@ -6,11 +6,10 @@ import flash.events.ProgressEvent; import haxework.net.manage.ILoaderManager; import haxework.provider.Provider; import flash.utils.ByteArray; -import haxework.net.callback.Callback; -import haxework.net.callback.ICallback; import flash.events.Event; +import promhx.Deferred; -class BaseLoader implements ILoader { +class BaseLoader extends Deferred implements ILoader { private static inline var TAG:String = "Loader"; @@ -28,27 +27,29 @@ class BaseLoader implements ILoader { private var url:String; private var method:String; private var data:Null; - private var callback:ICallback; private var timer:Timer; public function new(?timeout = 0) { + super(); this.timeout = timeout; busy = false; completed = Math.NaN; } - public function request(url:String, method:String, data:Dynamic = null):ICallback { - if (busy) throw "Busy"; - busy = true; - this.url = url; - this.method = method; - this.data = data; - callback = new Callback(); - var url:String = this.url; - //L.d(TAG, "Request: " + prepareUrl(url)); - //internalRequest(prepareUrl(url)); - Provider.get(ILoaderManager).add(this); - return callback; + public function request(url:String, method:String, data:Dynamic = null):Deferred { + if (busy) { + throwError("Busy"); + } else { + busy = true; + this.url = url; + this.method = method; + this.data = data; + var url:String = this.url; + //L.d(TAG, "Request: " + prepareUrl(url)); + //internalRequest(prepareUrl(url)); + Provider.get(ILoaderManager).add(this); + } + return this; } private function cockTimeout():Void { @@ -65,25 +66,24 @@ class BaseLoader implements ILoader { } } - public function fromBytes(data:ByteArray):ICallback { - if (busy) throw "Busy"; - busy = true; - callback = new Callback(); - internalFromBytes(data); - return callback; + public function fromBytes(data:ByteArray):Deferred { + if (busy) { + throwError("Busy"); + } else { + busy = true; + internalFromBytes(data); + } + return this; } - public function GET(url:String, data:Dynamic = null):ICallback { + public function GET(url:String, data:Dynamic = null):Deferred { #if (openfl && lime) if (StringTools.startsWith(url, "%assets%")) { var path:String = url.substring(9); var bytes:ByteArray = openfl.Assets.getBytes(path); if (bytes == null) { - Timer.delay(function() { - var c:ICallback = callback; - dispose(); - c.callFail("Bytes is null for asset: " + path); - }, 1); + throwError("Bytes is null for asset: " + path); + return null; } else { return fromBytes(bytes); } @@ -92,11 +92,11 @@ class BaseLoader implements ILoader { return request(url, URLRequestMethod.GET, data); } - public function POST(url:String, data:Dynamic = null):ICallback { + public function POST(url:String, data:Dynamic = null):Deferred { return request(url, URLRequestMethod.POST, data); } - public function DELETE(url:String, data:Dynamic = null):ICallback { + public function DELETE(url:String, data:Dynamic = null):Deferred { return request(url, URLRequestMethod.DELETE, data); } @@ -117,10 +117,11 @@ class BaseLoader implements ILoader { private function onComplete(e:Event):Void { var data:T = extrudeResult(e); if (data != null) { - var c:ICallback = callback; - dispose(); - c.callSuccess(data); + resolve(data); + } else { + throwError("Data is null"); } + dispose(); } private function onSecurityError(e:Event):Void { @@ -133,16 +134,14 @@ class BaseLoader implements ILoader { } private function onError(e:Event):Void { - var c:ICallback = callback; + throwError(e); dispose(); - c.callFail(e); } private function callTimeout():Void { - var c:ICallback = callback; var error:String = "Timeout for: " + url; + throwError(error); dispose(); - c.callFail(error); } private function extrudeResult(e:Event):T { @@ -154,13 +153,13 @@ class BaseLoader implements ILoader { cancelTimeout(); url = null; data = null; - callback = null; busy = false; completed = Math.NaN; Provider.get(ILoaderManager).release(this); } public function cancel():Void { + throwError("Cancelled"); dispose(); } diff --git a/src/main/haxework/net/BaseMediaLoader.hx b/src/main/haxework/net/BaseMediaLoader.hx index 146fc3c..d5b9c40 100755 --- a/src/main/haxework/net/BaseMediaLoader.hx +++ b/src/main/haxework/net/BaseMediaLoader.hx @@ -1,10 +1,5 @@ package haxework.net; -import haxework.net.callback.Callback; -import haxework.net.callback.ICallback; -import haxework.provider.Provider; -import haxework.storage.IStorage; -import flash.display.BitmapData; import flash.events.ProgressEvent; import flash.system.Security; import flash.system.SecurityDomain; @@ -22,24 +17,6 @@ class BaseMediaLoader extends BaseLoader { private var loader:Loader; - //ToDo: if storage use and local domen - //exclude youtube player - /*override public function GET(url:String, data:Dynamic = null):ICallback { - var storage:IStorage = Provider.get(IStorage); - return if (storage.exists(url)) { - fromBytes(storage.read(url)); - } else { - var callback:ICallback = new Callback(); - new BytesLoader().GET(url) - .success(function(data:ByteArray):Void { - storage.write(url, data); - fromBytes(data).glue(callback); - }) - .fail(callback.callFail); - callback; - } - }*/ - override private function internalRequest(url:String):Void { cockTimeout(); loader = buildLoader(); diff --git a/src/main/haxework/net/BaseURLLoader.hx b/src/main/haxework/net/BaseURLLoader.hx index 86f1681..80c3611 100755 --- a/src/main/haxework/net/BaseURLLoader.hx +++ b/src/main/haxework/net/BaseURLLoader.hx @@ -1,10 +1,10 @@ package haxework.net; +import flash.events.ErrorEvent; import haxe.Timer; import flash.utils.ByteArray; import flash.net.URLRequestHeader; import flash.net.URLRequestMethod; -import haxework.net.callback.ICallback; import flash.net.URLVariables; import flash.events.ProgressEvent; import flash.net.URLLoaderDataFormat; @@ -13,6 +13,7 @@ import flash.events.IOErrorEvent; import flash.net.URLRequest; import flash.events.Event; import flash.net.URLLoader; +import promhx.Thenable; class BaseURLLoader extends BaseLoader { @@ -45,14 +46,13 @@ class BaseURLLoader extends BaseLoader { } override private function internalFromBytes(data:ByteArray):Void { - var c:ICallback = callback; if (data == null) { - c.callFailAsync("Content not found"); + throwError("Content not found"); } else { var data:T = extrudeResultFromBytes(data); - c.callSuccessAsync(data); + resolve(data); } - Timer.delay(dispose, 1); + dispose(); } private function extrudeResultFromBytes(bytes:ByteArray):T { @@ -90,11 +90,16 @@ class BaseURLLoader extends BaseLoader { } override private function onError(e:Event):Void { - var c:ICallback = callback; var error:String = extrudeError(loader.data); - if (error != null) error = url + ": " + error; + if (error != null && error != "") { + error = error + ". URL: " + url; + } else if (Std.is(e, ErrorEvent)) { + error = cast(e, ErrorEvent).text; + } else { + error = "Unknown Error. URL: " + url; + } + throwError(error); dispose(); - c.callFail(error != null ? error : e); } private function extrudeError(data:Dynamic):String { diff --git a/src/main/haxework/net/BatchLoader.hx b/src/main/haxework/net/BatchLoader.hx index 67708c7..8828f02 100755 --- a/src/main/haxework/net/BatchLoader.hx +++ b/src/main/haxework/net/BatchLoader.hx @@ -1,9 +1,7 @@ package haxework.net; -import haxework.net.callback.Callback; -import haxework.net.callback.ICallback; -import flash.events.Event; -import flash.net.URLLoader; +import promhx.Promise; +import promhx.Deferred; class BatchLoader { @@ -13,39 +11,10 @@ class BatchLoader { this.factory = factory; } - public function GET(urls:Array):ICallback> { - var callbacks:Array> = urls.map(function(url:String):ICallback { + public function GET(urls:Array):Promise> { + return Promise.whenAll(urls.map(function(url:String):Promise { var loader:ILoader = Type.createInstance(factory, []); - return loader.GET(url); - }); - return new BatchCallback(callbacks); - } -} - - -class BatchCallback extends Callback> { - - private var data:Array; - private var counter:Int; - - public function new(callbacks:Array>) { - super(); - data = new Array(); - counter = callbacks.length; - for (i in 0...callbacks.length) { - register(callbacks[i], i); - } - } - - private function register(callback:ICallback, index:Int):Void { - callback - .success(function(d:T):Void { - data[index] = d; - if (--counter == 0) callSuccess(data); - }) - .fail(function(error:Dynamic):Void { - L.e("BatchLoader", "", error); - if (--counter == 0) callSuccess(data); - }); + return loader.GET(url).promise(); + })); } } \ No newline at end of file diff --git a/src/main/haxework/net/ILoader.hx b/src/main/haxework/net/ILoader.hx index 05d65a1..fd5a1bc 100755 --- a/src/main/haxework/net/ILoader.hx +++ b/src/main/haxework/net/ILoader.hx @@ -1,18 +1,18 @@ package haxework.net; import flash.utils.ByteArray; -import haxework.net.callback.ICallback; +import promhx.Deferred; interface ILoader { public var timeout(default, default):Int; public var busy(default, null):Bool; public var completed(default, null):Float; - public function request(url:String, method:String, data:Dynamic = null):ICallback; - public function fromBytes(data:ByteArray):ICallback; - public function GET(url:String, data:Dynamic = null):ICallback; - public function POST(url:String, data:Dynamic = null):ICallback; - public function DELETE(url:String, data:Dynamic = null):ICallback; + public function request(url:String, method:String, data:Dynamic = null):Deferred; + public function fromBytes(data:ByteArray):Deferred; + public function GET(url:String, data:Dynamic = null):Deferred; + public function POST(url:String, data:Dynamic = null):Deferred; + public function DELETE(url:String, data:Dynamic = null):Deferred; public function cancel():Void; public function run():Void; diff --git a/src/main/haxework/net/ImageLoader.hx b/src/main/haxework/net/ImageLoader.hx index fcb752e..997ff59 100755 --- a/src/main/haxework/net/ImageLoader.hx +++ b/src/main/haxework/net/ImageLoader.hx @@ -1,6 +1,5 @@ package haxework.net; -import flash.utils.ByteArray; import flash.display.LoaderInfo; import flash.display.Loader; import flash.display.Bitmap; diff --git a/src/main/haxework/net/JsonLoader.hx b/src/main/haxework/net/JsonLoader.hx index c34d78f..e3e4dd9 100755 --- a/src/main/haxework/net/JsonLoader.hx +++ b/src/main/haxework/net/JsonLoader.hx @@ -1,7 +1,6 @@ package haxework.net; import flash.utils.ByteArray; -import flash.errors.Error; import flash.events.Event; import flash.net.URLLoader; import haxe.Json; @@ -15,7 +14,7 @@ class JsonLoader extends BaseURLLoader { str = Std.string(cast(e.currentTarget, URLLoader).data); data = Json.parse(str); } catch (error:Dynamic) { - throw new Error(error + ": " + url); + throwError(error); } return data; } @@ -27,7 +26,7 @@ class JsonLoader extends BaseURLLoader { str = bytes.readUTFBytes(bytes.length); data = Json.parse(str); } catch (error:Dynamic) { - throw new Error(error + ": " + url); + throwError(error); } return data; } diff --git a/src/main/haxework/net/callback/AutoCallback.hx b/src/main/haxework/net/callback/AutoCallback.hx index 33d173f..419bff4 100755 --- a/src/main/haxework/net/callback/AutoCallback.hx +++ b/src/main/haxework/net/callback/AutoCallback.hx @@ -1,5 +1,6 @@ package haxework.net.callback; +@:deprecated("Use promhx.Deffered") class AutoCallback { public static function success(?value:T):ICallback { diff --git a/src/main/haxework/net/callback/Callback.hx b/src/main/haxework/net/callback/Callback.hx index 38e1eaa..2c7b5a9 100755 --- a/src/main/haxework/net/callback/Callback.hx +++ b/src/main/haxework/net/callback/Callback.hx @@ -2,6 +2,7 @@ package haxework.net.callback; import haxe.Timer; +@:deprecated("Use promhx.Deffered") class Callback implements ICallback { public static function build():ICallback { diff --git a/src/main/haxework/net/callback/ICallback.hx b/src/main/haxework/net/callback/ICallback.hx index 01b79bd..188678c 100755 --- a/src/main/haxework/net/callback/ICallback.hx +++ b/src/main/haxework/net/callback/ICallback.hx @@ -2,6 +2,7 @@ package haxework.net.callback; import haxework.core.IDisposable; +@:deprecated("Use promhx.Deffered") interface ICallback extends IDisposable { public function success(f:T -> Void):ICallback; public function fail(f:Dynamic -> Void):ICallback;