2015-08-23 5 views
1

Почему я не могу использовать переменную i в транзакции? console.log (данные); успешно выводит данные. console.log (данные [i]); говорит неопределенная ..Область видимости WebSql Javascript

  for(var i = 0; i < data.length ; i++){ 
      db.transaction(function(tx){ 
       console.log(data); 
       console.log(data[i]); 
       tx.executeSql('SELECT * FROM REGISTERED_EVENTS where EVENT_ID = ?', [data[i].id], function(tx, results){ 
        //do something 
       }); 
      }); 
     } 
+1

Что такое вывод console.log (данные)? –

+1

Из-за [этого] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example). – Vidul

+0

распечатывает массив данных с содержимым – user2598369

ответ

1

Почему я не могу доступ 'я' переменной в сделке?

Вы можете, но оно не будет иметь ожидаемого значения. Обратный вызов транзакции называется позже, когда цикл завершен. Этот обратный вызов имеет постоянную ссылку на переменную i, а не копию ее значения при создании обратного вызова и поэтому он видит i со значением data.length. И вы получите undefined за data[i].

В этой ситуации, я обычно использую функцию строитель, поэтому обратный вызов закрывается на переменную, которая не меняется:

for (var i = 0; i < data.length; i++) { 
    db.transaction(buildHandler(i)); 
} 
function buildHandler(index) { 
    return function(tx) { 
     console.log(data); 
     console.log(data[index]); 
     tx.executeSql('SELECT * FROM REGISTERED_EVENTS where EVENT_ID = ?', [data[index].id], function(tx, results) { 
      //do something 
     }); 
    }; 
} 

Это работает, потому что функция, которая создает buildHandler сохраняет ссылку на index и index никогда не меняется.

Или, в этом конкретные ситуации, вы могли бы получить хорошее использование из Array#forEach, потому что это уже дает переменную (ну, аргумент), что не изменится:

data.forEach(function(entry, index) { 
    db.transaction(function(tx) { 
     console.log(data); 
     console.log(data[index]); 
     tx.executeSql('SELECT * FROM REGISTERED_EVENTS where EVENT_ID = ?', [data[index].id], function(tx, results) { 
      //do something 
     }); 
    }); 
}); 
+0

Я еще не мог попробовать второе решение, но первый работает очень хорошо. Благодарю. – user2598369

Смежные вопросы