我遇到了一个问题,我想知道代码是否有可能禁止它创建单独的会话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'
});
};
答案 0 :(得分:1)
您的问题是您同时执行两个呼叫。所以执行的顺序是未知的。你需要做的是在第一次完成后调用第二个。为此,您需要在第一个回调中添加第二个http调用。
为了使你的代码更有条理,我推荐使用函数!使它更具可读性。
function doBothCalls(){
doFirstCallFunction(function(){
doSecondCallFunction();
}
}
doFirstCallFunction
然后获得一个回调函数,这个回调函数应该在第一个函数进入http回调后调用。
答案 1 :(得分:0)
这里需要的是Javascript中的Promises。
当你进行异步调用时,它们都以随机的时间顺序发生,因此你不能进行异步调用,这取决于同一执行上下文中的另一个异步调用的结果(你在代码中进行)
为了解决这个问题,Javascript具有promises
的功能,简而言之就是:
Promise对象表示可能尚未提供的值,但将在以后的某个时间点解析。它允许您以更同步的方式编写异步代码。例如,如果使用promise API对远程Web服务进行异步调用,则将创建一个Promise对象,该对象表示将来Web服务将返回的数据。