多个HTTP客户端请求不存储会话数据


Multiple HTTP Client Requests not storing session data

我有一个问题,我想知道是可能的代码是快,它创建单独的会话id,让我详细说明。我有两个独立的HTTP客户端,它们一个接一个地执行(参见下面的代码)。我有一个奇怪的问题是在第二个HTTP客户端请求我所做的是检索一些会话数据。然而,有时它返回的数据很好,而其他时候会话信息是未定义的,这会导致没完没了的问题。一旦我删除第二个Http客户端问题不再发生。

一点研究,我认为它可以归结为异步客户端,我可以重用相同的Http客户端变量为下一个操作和会话数据将被保留?任何建议或知识将不胜感激。

this.login = function(username, password, loaded, failed, incorrect) {
        var xhr = Ti.Network.createHTTPClient({
            onload : function(e) {
                var response = this.responseText;
                switch(response) {
                case "1":
                    loaded();
                    break;
                case "0":
                    incorrect();
                    break;
                case "2":
                    incorrect();
                    break;
                case "3":
                    incorrect();
                    break;
                default:
                    failed();
                }
            },
            onerror : function(e) {
                failed(e);
            },
            timeout : 5000,
            validatesSecureCertificate : false
        });
        xhr.open('POST', this.url, true);
        xhr.send({
            'action' : 'login',
            'email' : username,
            'password' : password,
        });
        var getdb = Ti.Network.createHTTPClient({
            onload : function(e) {
                var response = this.responseText;
                Ti.App.Properties.setString('name', response);
            },
            onerror : function(e) {
                failed(e);
            },
            timeout : 5000,
            validatesSecureCertificate : false
        });
        getdb.open('POST', this.url, true);
        getdb.send({
            'action' : 'get_name',
            'device' : 'mobile'     
        });
    };

您的问题是您同时执行两个调用的事实。所以执行的顺序是未知的。你需要做的是在第一个结束后打电话给第二个。要做到这一点,你需要在第一个回调中添加第二个http调用。

为了使你的代码更有条理,我建议使用函数!

function doBothCalls(){
    doFirstCallFunction(function(){
        doSecondCallFunction();
    }
}

doFirstCallFunction然后得到一个回调函数,这个回调函数你应该在第一个进入http回调后调用。

这里需要的是Javascript中的Promises。

当你做异步调用时,它们都以随机的时间顺序发生,所以你不能在相同的执行上下文中做一个依赖于另一个异步调用结果的异步调用(你在你的代码中做的)

为了克服这个问题,Javascript为promises提供了功能,简单来说就是:

Promise对象表示一个值,这个值可能现在还不可用,但是在将来某个时候会被解析。它允许您以更同步的方式编写异步代码。例如,如果你使用promise API对远程web服务进行异步调用,你将创建一个promise对象,该对象表示将来将由web服务返回的数据。