tag:robotlegs.tenderapp.com,2009-10-18:/discussions/problems/681-response-from-command-with-signalRobotlegs: Discussion 2012-11-20T10:07:17Ztag:robotlegs.tenderapp.com,2009-10-18:Comment/208980762012-11-16T10:20:33Z2012-11-16T10:20:33ZResponse from command with signal<div><p>Hey Maciej,</p>
<p>Let’s see if I understood the use case.</p>
<p>In SomeClass you dispatch SomeEvent.DATA_REQUESTED, that
triggers a command-> service.</p>
<p>SomeClass added 2 listeners:<br>
1. SomeEvent.DATA_RECEIVED and a handler onDataReceived<br>
2. SomeEvent.REQUEST_FAILED and a handler onRequestFailed<br>
3. In onDataReceived() you do something with the data and then
call, say, removeRequestEvents(). In this method you remove both
events, 1 + 2. Same for onRequestFailed, you do something with the
error mesagge (or not), then you call removeRequestEvents().</p>
<p>That’s what you can do with signals, too, remove both
listeners, when one of the 2 signals has been handled.</p>
<p>Of course, that’s possible if both handlers are in the
same class. If one class listens for SomeEvent.DATA_RECEIVED and
another class for REQUEST_FAILED, one of the handlers won’t
be called.</p>
<p>Now, the question is, are you handling both signals within the
same class? If the answer is yes, would my suggestion from above
work for you?</p>
<p>Ondina</p></div>Ondina D.F.tag:robotlegs.tenderapp.com,2009-10-18:Comment/208980762012-11-16T12:50:06Z2012-11-16T14:11:16ZResponse from command with signal<div><p>Hey Odina,<br>
yes, your assumtions are correct. I do exactly like you listed in
points 1-3 and handlers are in the same class. But how can I remove
listeners from signals? In events I've got targets instance, so
removing it's listeners wasnt a problem. Bt here I need instance of
both signals wich I dont have. E.g.:</p>
<pre>
<code>[Inject]
public var commandCaller:Signal;
private function callCommand():void {
var response:Signal = new Signal(Object);
response.addOnce(onResponse);
var error:Signal = new Signal(String);
error.addOnce(onError);
callCaler.dispatch(response,error);
}
private function onResponse(message:Object):void
//response listener is already removed but what about error listener?
}
private function onError(error:String):void
//error listener is already removed but what about response listener?
}</code>
</pre>
<p>I could send their instance through response/error along with
message/error parameter, but that doesnt seem pretty.</p></div>maciekreitag:robotlegs.tenderapp.com,2009-10-18:Comment/208980762012-11-16T14:45:55Z2012-11-16T14:45:55ZResponse from command with signal<div><p><strong>A Mediator</strong></p>
<pre>
<code> [Inject]
public var sendRequestSignal:SendrequestSignal;
[Inject]
public var signalDataVO:SignalDataVO;
private var response:Signal;
private var error:Signal;
override public function onRegister():void
{
response = new Signal(Object);
response.add(onResponse);
error = new Signal(String);
error.add(onError);
signalDataVO.responseSignal = response;
signalDataVO.errorSignal = error;
sendRequestSignal.dispatch(signalDataVO);
}
private function onResponse(message:String):void
{
trace("onResponse(message) " + message);
removeSignalsListeners();
}
private function onError(error:String):void
{
trace("onError(error) " + error);
removeSignalsListeners();
}
private function removeSignalsListeners():void
{
error.removeAll();
response.removeAll();
trace("error.numListeners " + error.numListeners + " response.numListeners " + response.numListeners);
}</code>
</pre>
<p><strong>VO</strong></p>
<pre>
<code>package yourdomain.models.vo
{
import org.osflash.signals.Signal;
public class SignalDataVO
{
private var _responseSignal:Signal;
private var _errorSignal:Signal;
public function SignalDataVO()
{
}
public function get errorSignal():Signal
{
return _errorSignal;
}
public function set errorSignal(value:Signal):void
{
_errorSignal = value;
}
public function get responseSignal():Signal
{
return _responseSignal;
}
public function set responseSignal(value:Signal):void
{
_responseSignal = value;
}
}
}</code>
</pre>
<p><strong>Signal</strong></p>
<pre>
<code>package yourdomain.controllers.signals
{
import org.osflash.signals.Signal;
import yourdomain.models.vo.SignalDataVO;
public class SendrequestSignal extends Signal
{
public function SendrequestSignal()
{
super(SignalDataVO);
}
}
}</code>
</pre>
<p><strong>Command</strong></p>
<pre>
<code>package yourdomain.controllers.commands
{
import org.robotlegs.mvcs.Command;
import yourdomain.models.vo.SignalDataVO;
public class SendRequestCommand extends Command
{
[Inject]
public var signalDataVO:SignalDataVO;
public function SendRequestCommand()
{
}
override public function execute():void
{
trace("SendRequestCommand.execute() ");
//say, you dispatch one of them:
signalDataVO.responseSignal.dispatch("data");
//signalDataVO.errorSignal.dispatch("error");
}
}
}</code>
</pre>
<p>Would that be a solution for you?</p></div>Ondina D.F.tag:robotlegs.tenderapp.com,2009-10-18:Comment/208980762012-11-17T11:34:23Z2012-11-17T11:34:23ZResponse from command with signal<div><p>Yes, it is solution for me. Although I was strugling before with
this implementation, because it some times can cause a lot of
response signals. All in all, thank you for your contribution.</p></div>maciekreitag:robotlegs.tenderapp.com,2009-10-18:Comment/208980762012-11-20T10:07:12Z2012-11-20T10:07:12ZResponse from command with signal<div><p>Hi Maciek,</p>
<blockquote>
<p>Yes, it is solution for me. Although I was strugling before with
this implementation, because it some times can cause a lot of
response signals. All in all, thank you for your contribution.</p>
</blockquote>
<p>You’re welcome.<br>
You’ll have to decide what’s best for you, using the
request/response signal pairs, or 2 signals, an ErrorSignal and a
ResponseSignal (with names of your choice), which you’d
inject into your command as well.</p>
<p>Cheers,<br>
Ondina</p></div>Ondina D.F.