Поддерживать состояние переменной в асинхронной функции
Я не знаю, есть ли термин для того, о чем я спрашиваю, поэтому я попытаюсь проиллюстрировать это:
У меня есть функция, которая принимает массив контактов и перебирает их, чтобы обновить их статус на веб-сайте. Функция'thing.getStatus'ничего не возвращает, но после успешного завершения дает статус (онлайн / офлайн / и т. Д.) Пользователя.
Проблема здесь в том, что когда вызывается внутренняя функция, переменная user_id является последней в массиве для всех вызовов функции, что делает невозможным узнать, каков статус и статус.
function gotGroupContacts(contacts) {
for ( i = 0; i < contacts.length; i++) {
var user_id = contacts[i];
something.getStatus(user_id, function(resp) {
updateLinkStatus(user_id, resp.status, resp.statusMessage);
}, getStatusErrorHandler);
}
}
Есть ли способ, которым я могу "заблокировать" переменную или иным образом передать ее функции внутри?
2 ответа
Приложить свой getStatus
вызов метода в замыкании, вот так
for ( i = 0; i < contacts.length; i++) {
var user_id = contacts[i];
(function(uid) {
something.getStatus(uid, function(resp) {
updateLinkStatus(uid, resp.status, resp.statusMessage);
}, getStatusErrorHandler);
}(user_id))
}
user_id
передается в анонимную функцию, выполняемую самим собой, и это обеспечивает правильное значение
Если ваш скрипт не должен быть совместимым с IE <9, вы можете написать так:
function gotGroupContacts(contacts) {
contacts.forEach(function(user_id){
something.getStatus(user_id, function(resp) {
updateLinkStatus(user_id, resp.status, resp.statusMessage);
}, getStatusErrorHandler);
});
}
ВНИМАНИЕ: метод forEach можно легко перенести в IE, см. Это: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach