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

时间:2016-10-05 14:46:33

标签: javascript php session appcelerator

我遇到了一个问题,我想知道代码是否有可能禁止它创建单独的会话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'     
        });

    };

2 个答案:

答案 0 :(得分:1)

您的问题是您同时执行两个呼叫。所以执行的顺序是未知的。你需要做的是在第一次完成后调用第二个。为此,您需要在第一个回调中添加第二个http调用。

为了使你的代码更有条理,我推荐使用函数!使它更具可读性。

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

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

答案 1 :(得分:0)

这里需要的是Javascript中的Promises

当你进行异步调用时,它们都以随机的时间顺序发生,因此你不能进行异步调用,这取决于同一执行上下文中的另一个异步调用的结果(你在代码中进行)

为了解决这个问题,Javascript具有promises的功能,简而言之就是:

  

Promise对象表示可能尚未提供的值,但将在以后的某个时间点解析。它允许您以更同步的方式编写异步代码。例如,如果使用promise API对远程Web服务进行异步调用,则将创建一个Promise对象,该对象表示将来Web服务将返回的数据。