我有一个适用于 AIR 的 Flex 应用程序。我通过类从 JSON-RPC Web 服务获取一些数据mx.rpc.http.HTTPService
。我异步进行所有调用。当结果返回时,我处理它们并通过flash.data.SQLConnection
. 这意味着每个 Web 服务调用都会有相当多的更新,因此每个回调都会启动一个事务,进行更新然后提交。
根据我的调试控制台跟踪,我看到两种行为:回调成功开始事务,调用事务事件处理函数,执行所有更新、提交,然后下一个 Web 服务调用返回。或者一个回调成功地开始一个事务,并且随着下一个 Web 服务调用返回(还没有尝试开始一个新事务),前一个回调只是......甚至在事务开始的回调之前就不再存在。
这是 Flex 中的错误吗?还是在空气中?还是在 ActionScript 中?还是在具体的组件上?我做错了吗?这只是我的误会吗?(我只是在 Flex 中尝试我的翅膀,我真的不知道对系统有什么期望或如何处理这种情况。)
我的数据库管理器类中的一些代码
public function beginTransaction(handler:Function):void {
// The calls are all fine up to this point
conn.begin(SQLTransactionLockType.DEFERRED, new Responder(handler, OnError));
// Begin is always called first. If another web service call doesn't come
// back up to this point then it won't until I call commit in an other
// function.
trace("this always runs yet");
// But if another call comes back just after begin is called then handler
// won't get called. Even though the previous trace still will.
}
我的网络服务调用
public function getWSCall(url:String, method:String, param:Object,
handler:Function):void
{
var http:HTTPService = new HTTPService();
http.addEventListener(FaultEvent.FAULT, JsonError);
http.addEventListener(ResultEvent.RESULT, handler);
http.url = url;
http.method = "POST";
http.contentType = "application/json";
var params:Object = {};
params.jsonrpc = "2.0";
params.method = method;
if (param !== null)
params.params = param;
params.id = method;
var json:String = JSON.stringify(params);
trace (url + " " + json);
http.send(json);
}
以及我如何称呼它的一个例子
JsonConnector.instance.getWSCall(WSConstants.GET_DATA_URL,
WSConstants.GET_DATA_METHOD, param, getDataCompleted);
在getDataCompleted
一些重新安排之后,我调用了我的数据库管理器类,我终于开始了事务:
dbConnector.Open(key, opened);
function opened(event:SQLEvent):void
{
if(event.type == SQLEvent.OPEN) {
dbConnector.beginTransaction(onBegin);
}
}