Поддерживать состояние переменной в асинхронной функции

Я не знаю, есть ли термин для того, о чем я спрашиваю, поэтому я попытаюсь проиллюстрировать это:

У меня есть функция, которая принимает массив контактов и перебирает их, чтобы обновить их статус на веб-сайте. Функция'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

Другие вопросы по тегам