Асинхронные процессы и объектно-ориентированная парадигма
Одним из объектно-ориентированных принципов является инкапсуляция кода. Каждый объект знает, как реализовать свои методы. Объекты знают только, как вызывать и как получить результат от методов других объектов.
Я не понимаю, как реализовать этот принцип, когда объектный метод выполняет вызовы удаленных служб.
Например:
Class A{
method1(){
...
}
method2(){
callRemote(receiveAnswer);
}
receiveAnswer(answer){
...
}
}
Class B{
main(){
A a = new A();
a.method2();
a.method1();
}
}
Метод method2() в классе A нуждается в методе receiveAnswer() для завершения самого себя => часть его логики находится внутри receiveAnswer(). И receiveAnswer() выполняется только после того, как удаленная служба отправит ответ.
В классе B main () выполняет a.method2(), а затем a.method1 () сразу после, не дожидаясь, пока удаленная служба ответит method2().
Очень часто для метода method1 () требуется полное выполнение метода method2() (включая обработку ответа удаленной службы) для правильного выполнения.
Должен ли я экстернализировать вызов удаленной службы в классе B (что кажется не очень подходящим, потому что в этом случае я бы выставил объектную логику извне)? Есть ли другой способ сделать это?
Спасибо;)
PS: я пишу код в ActionScript 3
1 ответ
Должен ли я передать вызов удаленной службе в классе B
Ты не должен. Для асинхронных процессов вы должны использовать обратные вызовы или наблюдатели: EventDispatcher, AS3Signals или простой обратный вызов функции.
Итак, это гласит:
Class B{
main(){
var a: A = new A();
//EventDispatcher
//a.addEventListener(Event.COMPLETE, onComplete);
//Signals
//a.complete.add(onComplete);
//Callback
//a.method(onComplete);
a.startAsyncProcess();
}
onComplete(){
//Magic with a result
}
}