0

我有一个适用于 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);
    }
}
4

0 回答 0