在netconnection上使用单例模式多次调用amfphp
我尝试在一个ActionScript方法上调用AMFPHP两次,结果只有第一次调用成功。第二个不会返回错误,不会发出任何警报,更可能的是它甚至不会发生,我不知道为什么 以下是一个例子:在netconnection上使用单例模式多次调用amfphp,php,actionscript-3,singleton,request,amfphp,Php,Actionscript 3,Singleton,Request,Amfphp,我尝试在一个ActionScript方法上调用AMFPHP两次,结果只有第一次调用成功。第二个不会返回错误,不会发出任何警报,更可能的是它甚至不会发生,我不知道为什么 以下是一个例子: public function editSomething():void{ if(dgChild.selectedIndex == -1){ Alert.show("You need to select a register in order to edit it."); re
public function editSomething():void{
if(dgChild.selectedIndex == -1){
Alert.show("You need to select a register in order to edit it.");
return;
}
_parent1.getParentByChild(dgChild.selectedItem.id);
_parent2.getParent2ByChild(dgChild.selectedItem.id);
}
当调用此方法时,第一个父对象被正常调用,而第二个父对象则不被正常调用
变量_parent1和_parent2是与PHP通信并保存结果的对象:
public class parentDAO{
//Service or Class that this objectDAO will be communicating with.
private const _phpController:String = "parentController/";
private var _AMFPHP:AMFPHP = AMFPHP.getInstance();
//ArrayCollection that will be filled with data comming from PHP/Database.
[Bindable] private var _dataProviderAeronave:ArrayCollection;
//I use public getter and setter for this dataProvider
public function getParentByChild(child_id:int):void{
_AMFPHP.GATEWAY.call(_phpController + "getParentByChild", new Responder(resultGetParent), child_id);
}
private function resultGetParent(result:Array):void{
dataProviderParent = new ArrayCollection(result);
}
}
现在,假设变量_parent1是上面声明的一个对象,_parent2是另一个类的另一个对象,非常类似于这个对象,并且假设这两个通信都工作得非常好,现在出现了问题:当我在一个ActionScript方法中调用这两个对象时。如果我只调用其中一个,它将正常工作,但当我调用两个服务时,第二个服务实际上从未调用过。我对此很确定,因为我可以通过服务捕获代理看到它
有什么想法吗?每次NetConnection类调用AMFPHP时,它都会自动关闭与路径的连接。所以,基本上下一个调用被忽略,我不知道为什么它没有显示在Flash调试器中。
我的解决方案是始终检查网关是否通过NetConnection类中的connected[read-only]属性连接。如果为false,我将强制建立一个新连接,瞧,脚本工作得非常好。知道如何修复这个类吗?我和你们有或多或少相同的问题,amfphp在尝试交流时已经很忙了,但我正在广泛使用这个类。 基本上,它所做的是调用ChannelPicker.getInstance.getNewRemoteObject
package communication
{
import flash.net.NetConnection;
import mx.core.FlexGlobals;
import mx.managers.BrowserManager;
import mx.managers.IBrowserManager;
import mx.messaging.ChannelSet;
import mx.messaging.channels.AMFChannel;
import mx.rpc.remoting.RemoteObject;
import spark.components.Label;
public class ChannelPicker
{
private static var instance:ChannelPicker;
protected var channelSet:ChannelSet= new ChannelSet();
protected var url:String;
static public function getInstance():ChannelPicker{
if(instance == null){
instance = new ChannelPicker();
}
return instance;
}
public function ChannelPicker()
{
do
{
var browser:IBrowserManager = BrowserManager.getInstance();
browser.init("","");
url = browser.url;
}while (url == null || url=="");
/*oracle_plajva is project name which ends up being html name of my file so to get current url i need to split it */
url = url.split(/oracle_plajva.html/)[0] + "Amfphp/index.php";
var chanel:AMFChannel = new AMFChannel("amfphp", url);
this.channelSet = new ChannelSet();
this.channelSet.addChannel(chanel);
}
public function getChannelSet():ChannelSet{
return channelSet;
}
public function getNewRemoteObject():RemoteObject{
var o:RemoteObject = new RemoteObject();
o.destination = "amfphp";
o.channelSet = channelSet;
return o;
}
public function getUrl():String{
return url;
}
}
}
_parent1和_parent2是不同于amfphp的服务。不同的类、不同的表等等。我不确定RemoteObject是如何工作的,也没有使用过它的经验,但每次调用此getNewremoteObject时,似乎都在分解新对象以连接AMFPHP。我的Singleton类的目的是缩小我在应用程序中构建的NetConnection对象的数量。你似乎只是想集中你与AMFPHP的连接位置,对吗?是的,没错。我可以刷新我的应用程序,只要它是单个实例,但如果我有两个flash player实例,并且我正在运行并同时调用AMFPHP服务,就会发生一些奇怪的事情,我不知道如何调试它。即使我使用两份相同的app和amfphp,也会发生同样的情况。所以我认为在flash浏览器端或amfphp端都有一些wierd缓存。不管怎样,这里是发生了什么,正如您在pic中看到的,出现了一些问题,使用RemoteObject有什么特别的原因吗?我可以在网络连接方面为您提供更多帮助。关于屏幕截图,我认为Row_number列来自使用Row_number魔术变量的select from Oracle。我对Oracle没有太多经验,但我确实记得这是为结果分页所必需的。您是否从Flex或Apache Log PHP收到任何错误消息?在图片中,我注意到这是两个不同的表。为什么要标记行号列?因为它应该被命名,因为标题文本不起作用,我的意思是,如果我用monster debugger检查它,两个实例都将其设置为正确,但它不是。我还尝试使用charles sniffer检查我的流量,amfphp在两次运行中运行相同的数据,所以我猜客户端一定出了问题,换句话说,是wierd flash player的一些bug。