PDA

Volledige versie bekijken : Generieke result en error functie bij RelayResponder


Aldentev
%Europe/Berlin %742 %2006, 18:49
Ik ben bezig met een generieke aanvraag van data. Dat lukt, alleen ik wil ook een generieke teruggave. Helaas zie ik geen mogelijkheid om een variabele aan de result functie te geven.

Ik heb dit:


public function serverConnection(strClass:String, strFunction:String, oVariables:Object):Void {
NetDebug.initialize();
this.netService = new Service(this.gatewayURL, null, strClass);
var pc:PendingCall = this.netService[strFunction](oVariables);
pc.responder = new RelayResponder(this, "handleResult", "handleError");
}


Hier geef ik in deze functie door de PHP klasse, de functie en welke variabelen hij moet aanroepen/doorgeven.

Nu wil ik ook dat als hij handleResult() aanroept dat hij weet van welke aanvraag bij welke result hoort, zonder steeds een andere functie door te geven.

Nou weet ik wel een oplossing en dat is om het aan de php door te geven en dat weer te laten returnen. Maar dat vind ik niet zo mooi. Is er een mogelijkheid voor?

Groeten Sander

Dauntless
%Europe/Berlin %763 %2006, 19:19
't Is een tamelijk grote gok, maar...

Probeer eens met deze aangepaste RelayResponder classe ? Ik ben zelf nog niet zo heel actief bezig met remoting dus ik kan 'm nog niet testen, maar ik hoop dat er geen fouten in zitten...
Hier zou je dus argumenten moeten kunnen megeven aan de constructor en die zouden (hopelijk) moeten megegeven worden naar de onFault en onResult.
//************************************************** **************************
//Copyright (C) 2004 Macromedia, Inc. All Rights Reserved.
//The following is Sample Code and is subject to all restrictions on
//such code as contained in the End User License Agreement accompanying
//this product.
//************************************************** **************************

import mx.rpc.Responder;

/**
This is a responder object that relays result and fault calls to a corresponding
function on the specified object.

@tiptext Dispatches results from a method invocation to user defined methods
@helpid 4491
*/
class mx.rpc.RelayResponder extends Object implements Responder {

private var args:Array;
/**
Constructs an instance of the relay that will call the specified methods
for result or fault on a given object.

@param resp Object Object that will handle the fault or result calls
@param resultFunc String String containing the name of the function to call, when result is recieved.
@param faultFunc String containing the name of the function to call, when a fault is recieved.
@tiptext Creates a new RelayResponder
@helpid 4492
*/
function RelayResponder( resp:Object, resultFunc:String, faultFunc:String ) {
super();
this.args = arguments.splice(2);
__obj = resp;
__onFault = faultFunc;
__onResult = resultFunc;
}

/*
When a fault in recieved, Fault Handler is called. onFault dispatches the fault message.
@param fault Object contains information of the fault recieved. This includes specified code, message, and details
*/
function onFault( fault:mx.rpc.FaultEvent ):Void {
var a:Array = new Array(fault);
a = a.concat(this.args);
__obj[ __onFault ].apply(__obj, a);
}

/*
Result Handler is called when a result is recieved. onResult dispatches the result message

@param result reference to the result after successfult method invocation
*/
function onResult( result:mx.rpc.ResultEvent ):Void {
var a:Array = new Array(result);
a = a.concat(this.args);
__obj[ __onResult ].apply(__obj, a);
}

private var __obj:Object;
private var __onFault:String;
private var __onResult:String;
}

Aldentev
%Europe/Berlin %804 %2006, 20:18
Ja dat werkt, ik heb niet precies jouw dingen overgenomen, maar het aanpassen werkt.

Nadeel is wel dat het niet werkt op een andere pc met flash. Is dat nog op te lossen? Zo maar een nieuwe klasse aanmaken en in mijn klassemap zetten werkt niet.

Dauntless
%Europe/Berlin %971 %2006, 00:19
True... Maar je kan 'm ook als zelfgemaakte classe neerzetten en dan houd je hem gewoon bij je gewone files (.fla, custom classes) bij.

(Mag ik je aangepaste versie zien?)

Aldentev
%Europe/Berlin %537 %2006, 13:53
Het is bijna hetzelfde als die van jouw hoor, ik had het eerst anders (maar 1 variabele was mogelijk) maar heb toch mogelijk gemaakt om meerdere variabelen te geven. En dit is 4 regels korter ;)


//************************************************** **************************
//Copyright (C) 2004 Macromedia, Inc. All Rights Reserved.
//The following is Sample Code and is subject to all restrictions on
//such code as contained in the End User License Agreement accompanying
//this product.
//************************************************** **************************
import mx.rpc.Responder;
/**
This is a responder object that relays result and fault calls to a corresponding
function on the specified object.

@tiptext Dispatches results from a method invocation to user defined methods
@helpid 4491
*/
class mx.rpc.RelayResponder extends Object implements Responder {
/**
Constructs an instance of the relay that will call the specified methods
for result or fault on a given object.

@param resp Object Object that will handle the fault or result calls
@param resultFunc String String containing the name of the function to call, when result is recieved.
@param faultFunc String containing the name of the function to call, when a fault is recieved.
@tiptext Creates a new RelayResponder
@helpid 4492
*/
function RelayResponder(resp:Object, resultFunc:String, faultFunc:String, aArgs:Array) {
super();
__obj = resp;
trace(aArgs);
__onFault = {cb:faultFunc, args:aArgs};
__onResult = {cb:resultFunc, args:aArgs};
}
/*
When a fault in recieved, Fault Handler is called. onFault dispatches the fault message.
@param fault Object contains information of the fault recieved. This includes specified code, message, and details
*/
function onFault(fault:mx.rpc.FaultEvent):Void {
__onResult.args.splice(0, 0, fault);
__obj[__onFault.cb].apply(null, __onFault.args);
}
/*
Result Handler is called when a result is recieved. onResult dispatches the result message

@param result reference to the result after successfult method invocation
*/
function onResult(result:mx.rpc.ResultEvent):Void {
__onResult.args.splice(0, 0, result);
__obj[__onResult.cb].apply(null, __onResult.args);
}
private var __obj:Object;
private var __onFault:Object;
private var __onResult:Object;
}


Als ik een zelfgemaakte classe bv CustomRelayResponder noem (en deze opsla in mijn class map) dan voert hij de functies niet uit. Wat doe ik dan verkeerd?

Dauntless
%Europe/Berlin %547 %2006, 14:07
Importeer je nog altijd de echte RelayResponder?

Maar als je overal 'new CustomRelayResponder' gebruikt, dan zou het toch moeten werken...

Aldentev
%Europe/Berlin %569 %2006, 14:40
Ik heb nu dit:


class CustomRelayResponder extends Object implements Responder {


en


pc.responder = new CustomRelayResponder(this, "handleResult", "handleError", [strClass]);


Dit werkt niet, wat moet ik dan nog meer veranderen om het wel te laten werken?

Dauntless
%Europe/Berlin %583 %2006, 15:00
En je krijgt geen compile fouten?

Aldentev
%Europe/Berlin %597 %2006, 15:20
Oops domme fout, dan moet ik ook wel de constructor CustomRelayResponder noemen :D

Nou het werkt! Harstikke bedankt!

Dauntless
%Europe/Berlin %617 %2006, 15:48
Graag gedaan :).

De Kale
%Europe/Berlin %709 %2006, 18:01
je moet nu toch weer een nieuwe parameter meegeven.
wat is het probleem met een nieuwe handler mee te geven?

ik heb wel een kleine aanpassing gemaakt:

public function getData(method, serviceHandler, serviceErrorHandler){//accepts a variable number of arguments
//call the method on the service object, in the scope of the service object, and pass the remaining arguments to the method!
var pc:PendingCall = service[method].apply(service, arguments.slice(3, arguments.length));
pc.responder = new RelayResponder(this, serviceHandler, serviceErrorHandler);

}