WebSQL. Insert в цикле FOR или WHILE

153
13 мая 2021, 23:50

Не могу разобраться, как заставить исполняться транзакцию каждый раз в цикле, а не только последний. Код специально упростил. Получается что uid генерится новый и попадает в Insert, a i всегда принимает значение последнего.

var db = openDatabase("testdb", "1.0", "Web SQL Storage", 1 * 1024 * 1024); 
db.transaction( 
  function(tx) { 
    tx.executeSql("CREATE TABLE IF NOT EXISTS test (id TEXT NOT NULL PRIMARY KEY," + "idx INTEGER)", [], null, null); 
  }); 
var a = 10; 
var i = 0; 
while (i < a) { 
  function uid() { 
    return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 
      var r = Math.random() * 16 | 0, 
        v = c == 'x' ? r : (r & 0x3 | 0x8); 
      return v.toString(16); 
    }); 
  }; 
  db.transaction( 
    function(tx) { 
      tx.executeSql("INSERT INTO test(id, idx) VALUES (?, ?)", [uid(), i], null, null); 
      console.log(i); 
    } 
  ); 
  i++; 
}
Что я делаю не так? Как исправить, учитывая что все делаю только гугля, так как JS не знаю.. Просто надо...

UPD: Проблема с i была вызвана замыканием. Решается еще одним замыканием. Создаем ее копию в локальной области видимости на каждом шаге цикла. Но задачу усложняем. Нам нужно пробежаться, допустим по всем элементам страницы и внести значения всех ссылок в бд.

var db = openDatabase("testdb", "1.0", "Web SQL Storage", 1*1024*1024); 
db.transaction( 
	function(tx) { 
		tx.executeSql("CREATE TABLE IF NOT EXISTS test1 (id TEXT NOT NULL PRIMARY KEY, idx INTEGER, url TEXT)", [], null, null); 
}); 
var i = 0; 
var list = $('a[class*=js-gps-track]'); 
while (i < list.length){ 
	a = list[i].href 
	function uid() { 
		return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 
			var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); 
			return v.toString(16); 
		}); 
	}; 
	(function(i){ 
		db.transaction( 
			function(tx){ 
				tx.executeSql("INSERT INTO test1(id, idx, url) VALUES (?, ?, ?)", [uid(), i, a], null, null); 
				console.log(i); 
			} 
		);	 
	})(i); 
		i++; 
}

Теперь у нас и i и uid уникальные для каждой записи. Но ссылка всегда одна... К сожалению, именно эту задачу мне и предстоит решить, поэтому и обращаюсь за помощью.

Answer 1
tx.executeSql("INSERT INTO test1(id, idx, url) VALUES (?, ?, ?)", [uid(), i, list[i].href], null, null);

Если так, то все работает верно... Чтобы в итоге все заработало, нужно объявлять a, через let:

let a = list[i].href
READ ALSO
Как написать регулярное выражение для удаления миллисекунд в формате ISO

Как написать регулярное выражение для удаления миллисекунд в формате ISO

У меня есть дата в iso формате 2019-08-04T23:01:02447Z Как написать регуляное выражение для удаления миллисекунд, что бы получилась строка такого типа...

92
Некорректно работает js на iphone

Некорректно работает js на iphone

Помогите решить проблему работы js на iphone - бьюсь третий день, никак не пойму как решитьСайт: https://ugli33

125
Для чего еще используется ключевое слово this?

Для чего еще используется ключевое слово this?

Знаю что ключевое слово this, если функция является конструктором используется для того чтобы можно было обратиться к новосозданному объекту,...

85
Атрибуты тега в jsx

Атрибуты тега в jsx

Можно ли динамически изменить атрибуты тэга jsxДля примера есть код

287