У меня есть проблема, и я удивляюсь, возможно ли, что код предназначен для быстрого создания отдельных идентификаторов сессий, позвольте мне остановиться подробнее. У меня есть два отдельных 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-й после того, как первый закончил. Чтобы это работало, вам нужно добавить второй http-вызов в обратный вызов первого.
И чтобы сделать ваш код более организованным, я рекомендую использовать функции! Делает это также более читабельным.
function doBothCalls(){
doFirstCallFunction(function(){
doSecondCallFunction();
}
}
doFirstCallFunction
затем получает функцию обратного вызова, эту функцию обратного вызова вы должны вызвать после того, как первая из них попадет в обратный вызов http.
То, что вам нужно здесь, называется обещания в JavaScript
Когда вы выполняете асинхронные вызовы, все они происходят в произвольном порядке времени, поэтому вы не можете выполнять асинхронный вызов, который зависит от результата другого асинхронного вызова в том же контексте выполнения (что вы делаете в своем коде)
Чтобы преодолеть это, Javascript имеет функциональность для promises
что в двух словах означает:
Объект Promise представляет значение, которое может быть еще недоступно, но будет разрешено в определенный момент в будущем. Это позволяет вам писать асинхронный код более синхронно. Например, если вы используете API обещаний для выполнения асинхронного вызова удаленной веб-службы, вы создадите объект Promise, который представляет данные, которые будут возвращены веб-службой в будущем.