Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   закончилось место в localstorage. что делать? (https://javascript.ru/forum/misc/30675-zakonchilos-mesto-v-localstorage-chto-delat.html)

Deff 16.08.2012 01:19

mitiya,
Есть еще File Api для мобилок http://habrahabr.ru/post/139492/
http://habrahabr.ru/company/microsof...6158/#habracut

mitiya 16.08.2012 02:08

Цитата:

Сообщение от Deff (Сообщение 197904)

что-то я не понимаю как это мне может помочь ?

mitiya 18.08.2012 00:40

вот что мне удалось сделать

var dataBase = "TextsDB" ;

			$.indexedDB(dataBase, {
				schema: {
					 "1": function(versionTransaction){
					 var texts = versionTransaction.createObjectStore("texts", {
					 "keyPath": "hash"
					 });
					 texts.createIndex("hash");
					 }
				}
			}).then(console.info, console.error);

addData(dataBase, "texts", { hash: '846847', text: 'jhklj'})

getData(dataBase, "texts", "846847");


function addData(db, oS, obj) {
	var transaction = $.indexedDB(db).objectStore(oS);
	transaction.add(obj);
}

function getData(db, oS, hash) {
	var out
	$.indexedDB(db).objectStore(oS).get(hash).done(function(elem){
				out = elem;
				alert('out=' + out.text);
			});
	return out
}


собственно с грехом пополам работает создание базы, добавление туда записи. и даже получение работает, но почему-то алерт показывает то что нужно только внутри функции а ретурнить то что мне надо не хочет,

vadim5june 18.08.2012 07:34

Цитата:

Сообщение от mitiya
ретурнить то что мне надо не хочет

что то все хотят в асинхронных функциях return
вот здесь на сайте мозиллы
https://developer.mozilla.org/en-US/docs/IndexedDB
написано что в настоящее время работает только асинхронная версия API indexedDB
а синхронная пока не работает ни в одном браузере
Note: The synchronous APIs of IndexedDB have not yet been implemented in any browser.
В асинхронных процессах мы не можем выполнить return а используем callback
напишите
function getData(db, oS, hash,callback)
......get(hash).done(callback)...

mitiya 18.08.2012 14:06

я если честно в асинхронном программировании ничего не понимаю.
можно поподробней ?

vadim5june 18.08.2012 14:20

Цитата:

Сообщение от mitiya (Сообщение 198509)
я если честно в асинхронном программировании ничего не понимаю.
можно поподробней ?

Когда ты хотел вернуть переменную с помощью return
что хотел дальше сделать?
Использовать в какой то функции?
Напиши ее еcли она есть а мы ее запустим как callback

mitiya 18.08.2012 14:52

мне нужно тест запихнуть в свойство объекта что бы потом в разных местах с ним работать. пытаюсь сделать так :

obj = {text: 'tt'} ;

getData(dataBase, "texts", "846847", function(elem) { 
			alert('elem.text=' + elem.text);
			obj.text = elem.text;
		});
alert('obj.text=' + obj.text);

function getData(db, oS, hash, callback) {
	$.indexedDB(db).objectStore(oS).get(hash).done(callback);
}


в результате alert('elem.text=' + elem.text); // нужный текст выдает

а alert('obj.text=' + obj.text); // выдает tt , то-есть старое значение.

я так понимаю, что дело в том что ответ на функцию getData приходит позже чем вызов alert('obj.text=' + obj.text);
но мне то все равно нажо получить этот текст в obj.text

vadim5june 18.08.2012 15:18

Цитата:

Сообщение от mitiya (Сообщение 198521)
но мне то все равно нажо получить этот текст в obj.text

вот так вот делайте
getData(dataBase, "texts", "846847", function(elem) {
           ff(elem)
        });
function ff(el){
var obj={text:el.text} ;
//здесь код в котором используется obj
}

mitiya 18.08.2012 15:25

но все-равно все будет по сути внутри коллбэка ?
а нельзя как-то при вызове getData заставить скрипт ждать прихода результата ?

мне грубо говоря нужно закэшировать этот текст, потому как с ним ного каких операций дальше будет производиться, и каждый раз запрашивать его в этом асинхронном режиме из базы совсем не хочется.

vadim5june 18.08.2012 15:29

Цитата:

Сообщение от mitiya (Сообщение 198525)
но все-равно все будет по сути внутри коллбэка ?
а нельзя как-то при вызове getData заставить скрипт ждать прихода результата ?

нет такой возможности приостановить скрипт-
то что будет внутри callback это нормально-никто не запрещает оттуда вызывать функции определенные на глобальном уровне

Deff 18.08.2012 15:30

mitiya,
Юзайте FILE API :)

vadim5june 18.08.2012 15:35

Цитата:

Сообщение от Deff (Сообщение 198529)
mitiya,
Юзайте FILE API :)

он тоже асинхронный

Deff 18.08.2012 15:39

vadim5june,
Да прост на мобилах пользуются именно им - поскольку и фото и музыка на туда же грузиться ... смысла юзать два метода ?

vadim5june 18.08.2012 15:42

Цитата:

Сообщение от Deff (Сообщение 198536)
vadim5june,
Да прост на мобилах пользуются именно им - поскольку и фото и музыка на туда же грузиться ... смысла юзать два метода ?

а он под андроид работает?
Не вкурсе под какой версией и с каким браузером?

mitiya 18.08.2012 15:44

Цитата:

Сообщение от vadim5june (Сообщение 198528)
нет такой возможности приостановить скрипт-
то что будет внутри callback это нормально-никто не запрещает оттуда вызывать функции определенные на глобальном уровне

да но, но что делать если тест еще не пришел, а на глобальном уровне его вызывают.

блин
может сделать внутри getData
что-то вроде
do {}
while (obj.text == 'tt')

я не понимаю почему вот тут

obj = {text: 'tt'} ;

getData(dataBase, "texts", "846847", function(elem) { 
			alert('elem.text=' + elem.text);
			obj.text = elem.text;
		});


ничего не оправляется на глобальный уровень, ведь obj объявлен на глобальном уровне вроде как.

vadim5june 18.08.2012 15:45

Цитата:

Сообщение от mitiya
мне грубо говоря нужно закэшировать этот текст, потому как с ним ного каких операций дальше будет производиться, и каждый раз запрашивать его в этом асинхронном режиме из базы совсем не хочется

А зачем каждый раз запрашивать если он меняться не будет-один раз только-запишите его в глобальную переменную никто не мешает-главное чтобы не обращались до тех пор пока первый getData не будет выполнен

vadim5june 18.08.2012 15:52

Цитата:

Сообщение от mitiya
но что делать если тест еще не пришел, а на глобальном уровне его вызывают.

главное отличие от синхронного чтобы таких ситуаций не было-заведите какую то переменную var pr=0;как текст придет pr=1;
и проверяйте при вызове
лучший выход весь код поместить в callback или другие функции вызываемые из callback

vadim5june 18.08.2012 16:16

Цитата:

Сообщение от mitiya
я не понимаю почему вот тут
ничего не оправляется на глобальный уровень, ведь obj объявлен на глобальном уровне вроде как.

cкорее всего он на глобальном уровне и определен-но обращаетесь к нему раньше-тут важно учитывать когда можно обратиться

Deff 18.08.2012 16:17

Цитата:

Сообщение от vadim5june
лучший выход весь код поместить в callback или другие функции вызываемые из callback

Можно в callback - (дабы не перемещать в него все функции ) кликать кнопку, - событие на которой отслеживаем функцией обработки результата (эт удобно - когда текущая структура функций уже создана

mitiya 19.08.2012 00:31

не пойму почему не работает
do {}
while (obj.text == 'tt')


внутри getData, зависает.

mitiya 07.09.2012 16:34

поместил в callback обработчики кликов.
но в некоторых случаях происходит что callback вызывается когда он уже вызван, и в результате клики отрабатываются дважды, трижды и тд.

Как бы мне при вызове callback прибить предыдущий вызванный callback ?


Часовой пояс GMT +3, время: 20:39.