Передача аргументов анонимным функциям JavaScript
Рассмотрим код ниже:
this.usedIds = 0;
this.SendData = function(data)
{
var id = this.usedIds;
this.usedIds++;
this.xmlHttpThing.open("POST", "/Upload.aspx", true);
this.xmlHttpThing.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var currentObject = this;
this.xmlHttpThing.onreadystatechange = function() { currentObject.UploadComplete(id) };
this.xmlHttpThing.send(data);
};
this.UploadComplete = function(id)
{
if (this.xmlHttpThing.readyState == 4)
{
//First time id is 0
//Second time id is 0 <<<--------- Why??
//Third time id is 1
//Fourth time id is 2
//Fifth time id is 3 ....
this.SendData("blabla");
}
};
Почему идентификатор, который я передаю функции anonymus, задерживается на один вызов после первого вызова?
В Firefox только так и происходит, в IE UploadComplete получает идентификаторы в правильном порядке.
Во втором цикле я могу остановить отладчик на линии send(data) и подтвердить, что id на самом деле равен 1, но когда я попадаю в UploadComplete, в этом аргументе оказывается 0:(
РЕДАКТИРОВАТЬ: Найдено решение: отключить консольный журнал в FireBug.
2 ответа
Решение
У меня была такая же проблема в прошлом. Я не помню точно, что вызвало это, но я исправил это, переместив приращение в обработчик ответа.
this.UploadComplete = function(id)
{
if (this.xmlHttpThing.readyState == 4)
{
this.usedIDs++;
this.SendData("blabla");
}
};
Изменить: после размышления, мой случай, возможно, отличался от вашего. Почему бы не увеличить this.usedIDs
когда вы назначаете id
?
var id = this.usedIDs++;