Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 349

Indexeddb - формирование массива значений из хранилища

07.07.2025, 11:50. Показов 922. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если не затруднит, не подскажите, можно ли решить:

Хранилище создаю таким образом:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    let store = db.createObjectStore('film', {
        autoIncrement: true
    }); 
 
 function idb_frmMas () {
    let nam_xr= 'film';
    const txn = idb_db.transaction(nam_xr, 'readonly');
    const p_xr = txn.objectStore(nam_xr);
    let query = p_xr.getAll();
    query.onsuccess = (event) =>{
        if (!event.target.result) {
            inf2.innerHTML = "  "+ nam_xr+ " empty !!!";
        } else {
        m= event.target.result;
        return m;
        }
    };
    query.onerror = (event) =>{
    inf2.innerHTML = "onerror │ "+ event.target.errorCode;
    return ;    // null
    }
}
 
 
function frm_1 (e)  {
    let m_1 = idb_frmMas ();
 
    inf1.innerHTML = " = "+ m_1+ " <br> typeof (m_1)= "+ typeof (m_1);
}
Массив m в idb_frmMas () создается правильно, но при наличии нескольких хранилищ хочу функцию idb_frmMas сделать стандартной, а массив уже формировать в вызывающей функции, что не получилось реализовать - в frm_1() m_1 не формируется (видимо нет понимания функционирования прерываний - попытался через return m - но, увы, этот вариант неверный).
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.07.2025, 11:50
Ответы с готовыми решениями:

Сохранение больших объемов данных в indexeddb
Мне нужно сохранить в indexeddb 50000 записей. Это можно сделать только вызывая store.add для...

Работа с indexedDB
Доброго времени суток! Никак не могу разобраться с indexedDB. Все примеры, которые я пытался...

indexedDB
Доброго времени суток. Друзья, нужна Ваша помощь. Никак не могу разобраться, почему выдает такую...

14
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3806 / 1643 / 428
Регистрация: 14.03.2022
Сообщений: 4,088
07.07.2025, 13:39
Я не работал с Indexeddb...
Но чисто по работе с функциями могу дать некий совет.
Цитата Сообщение от 755 Посмотреть сообщение
попытался через return m - но, увы, этот вариант неверный
Если хочешь что-то вернуть из функции idb_frmMas - можно использовать промис. Функция станет асинхронной.

Т.е. нечто такое...

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function idb_frmMas () {
    return new Promise((resolve, reject) => {
        let nam_xr= 'film';
        const txn = idb_db.transaction(nam_xr, 'readonly');
        const p_xr = txn.objectStore(nam_xr);
        let query = p_xr.getAll();
        query.onsuccess = (event) =>{
            const m = event.target.result;
            if (m) return resolve(m);
            inf2.innerHTML = "  "+ nam_xr+ " empty !!!";
            resolve(null)
        };
        query.onerror = (err) =>{
            inf2.innerHTML = "onerror │ "+ err.target.errorCode;
            reject(err)
        }
    })
}
 
 
function frm_1 (e)  {
    idb_frmMas ()
        .then(m_1 => inf1.innerHTML = " = "+ m_1+ " <br> typeof (m_1)= "+ typeof (m_1))
        .catch(console.log)
}
1
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 349
07.07.2025, 14:38  [ТС]
Спасибо большое, krvsa, изучаю
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3806 / 1643 / 428
Регистрация: 14.03.2022
Сообщений: 4,088
07.07.2025, 14:45
Лучший ответ Сообщение было отмечено 755 как решение

Решение

755, немного подправил свой пример...
Чтобы получение данных было в одном месте... А вывод информации - в другом.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function idb_frmMas () {
    return new Promise((resolve, reject) => {
        let nam_xr= 'film';
        const txn = idb_db.transaction(nam_xr, 'readonly');
        const p_xr = txn.objectStore(nam_xr);
        let query = p_xr.getAll();
        query.onsuccess = (event) =>{
            const m = event.target.result;
            resolve(m ? m : null);
        };
        query.onerror = err => reject(err.target.errorCode))
}
 
function frm_1 (e)  {
    idb_frmMas ()
        .then(m_1 => {
            if (m_1) inf1.innerHTML = " = "+ m_1+ " <br> typeof (m_1)= "+ typeof (m_1)
            else inf2.innerHTML = "  "+ nam_xr+ " empty !!!"
        })
        .catch(err => inf2.innerHTML = "onerror │ "+ err)
}
2
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 349
07.07.2025, 15:15  [ТС]
Видимо неправ, откладывая изучение промисов на потом... (возможно, правда есть вариант из без промисов - но это уже чисто теоретически)

krvsa, все работает. Правда в предложенном Вами варианте переменная глобально не создается. (mas_ti ее не видит) Поэтому немного видоизменил (не знаю, можно ли так, но массив стал виден):

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function frm_1 ()  {
    idb_frmMas ()
        .then(m => m_1= m)
        .catch(console.log)
}
 
function mas_ti (kl)    {
 if (typeof (m_1) === 'undefined')  {
    inf2.innerHTML = "*** m_1 - undefined ***";
 }
 else {
    st= '-- m_1 ---';
    for (i = 0; i < m_1.length; i++) {
        st += "<br>"+ m_1[i];
    }
    inf1.innerHTML = st;
}
}
Добавлено через 4 минуты
Цитата Сообщение от krvsa Посмотреть сообщение
755, немного подправил свой пример...
Чтобы получение данных было в одном месте... А вывод информации - в другом.
Спасибо, krvsa, это логичнее - в одном месте получаю, а уже в других функциях полученный массив используется - тестирую
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3806 / 1643 / 428
Регистрация: 14.03.2022
Сообщений: 4,088
07.07.2025, 15:18
Цитата Сообщение от 755 Посмотреть сообщение
переменная глобально не создается
Разумеется.
Это же асинхронность. Никто не знает когда разрешится промис. Для этого есть методы then и catch. Там нужно выполнять всю дальнейшую обработку...
0
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 349
07.07.2025, 15:22  [ТС]
Цитата Сообщение от krvsa Посмотреть сообщение
Я не работал с Indexeddb...
Кстати, данная технология показалась очень интересной и полезной. Возможно при небольшом объеме сохраняемой информации достаточно и localStorage, иначе же есть варианты.

Добавлено через 1 минуту
Цитата Сообщение от krvsa Посмотреть сообщение
Это же асинхронность. Никто не знает когда разрешится промис. Для этого есть методы then и catch. Там нужно выполнять всю дальнейшую обработку...
Понятно, спасибо огромное за помощь.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3806 / 1643 / 428
Регистрация: 14.03.2022
Сообщений: 4,088
07.07.2025, 15:22
755, типа такого... Правда я не знаю кто такой kl...
В любом случае тебе нужно наловчиться работать с асинхронными функциями.
https://learn.javascript.ru/async

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function frm_1 ()  {
    idb_frmMas ()
        .then(m => mas_ti(m, kl))
        .catch(console.log)
}
 
function mas_ti (m_1, kl)    {
    if (typeof (m_1) === 'undefined')  {
        inf2.innerHTML = "*** m_1 - undefined ***";
    } else {
        st= '-- m_1 ---';
        for (i = 0; i < m_1.length; i++) {
            st += "<br>"+ m_1[i];
        }
        inf1.innerHTML = st;
    }
}
1
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 349
07.07.2025, 15:54  [ТС]
krvsa, еще раз спасибо - супер !!! Все работает.

Цитата Сообщение от krvsa Посмотреть сообщение
Правда я не знаю кто такой kl
В данном случае не имеет значения - в другой функции указывал индекс удаляемого элемента массива - не обратил внимания, что он остался в параметрах

Цитата Сообщение от krvsa Посмотреть сообщение
В любом случае тебе нужно наловчиться работать с асинхронными функциями.
Вроде бы изучал, но видимо недостаточно .
0
352 / 315 / 83
Регистрация: 17.04.2022
Сообщений: 1,032
Записей в блоге: 8
07.07.2025, 15:59
755, а не пытались освоить https://dexie.org/ ?
По-моему, существенно удобнее
1
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 349
07.07.2025, 16:11  [ТС]
sqltd1, спасибо за совет.

Возможно и ошибочно, но решил, что библиотека мне не нужна - проще и интереснее будет самому написать необходимые функции с учетом структуры информации в хранилищах.
Кроме того, мне не так уж и много их надо (по крайней мере пока ) для работы с IndexedDB.
И, что не менее важно, одновременно с написанием функций происходит освоение не только БД, но и еще каких-то новых для меня механизмов.
0
Эксперт .NET
 Аватар для Usaga
14098 / 9315 / 1349
Регистрация: 21.01.2016
Сообщений: 34,990
07.07.2025, 16:37
755, на правах рекомендации: не надо давать переменным и функциям имена будто ты партизан в плену, шифруешь от врагов что можешь.

Когда ты для себя пишешь - бог с тобой. Твори что хочешь. Но когда людям показываешь и помощи просишь, то не надо усложнять им восприятие твоего кода.
1
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 349
07.07.2025, 17:23  [ТС]
Usaga, в данном случае и мысли не было, что при такой минимальной логике могут возникнуть сложности с переменными.

А так учту на будущее.

Хотя есть один момент: имена переменных и функций не шифрую, а мне так удобнее - во-первых, набирать на клавиатуре; во-вторых, для меня, например, что key, что kl (ключ) синонимы, зато как для русского человека kl еще и ближе.
Код же как правило беру реальный и боюсь, при его изменении (увеличении имен переменных для наглядности), можно где-то и пропустить - а в таком случае пострадает уже логика.
0
Эксперт .NET
 Аватар для Usaga
14098 / 9315 / 1349
Регистрация: 21.01.2016
Сообщений: 34,990
08.07.2025, 03:36
755, логика минимальная, но со старта уже несёт когнитивную нагрузку, которой могло не быть. И это при минимальной логике. А когда её станет больше? А когда несколько месяцев пройдёт? Негатив от абы как названых сущностей в том, что не изучив их код не поймёшь что они делают. Названия сущностей являются частью документации кода.

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

Ну и про удобство набора текста... В 2025 году обсуждать такое уже как бы не серьёзно. Автоподстановка лексем есть во всём, что сложнее Notepad. Даже в DevTools в консольке это есть. Ты не забывай, что ты свой код читаешь в разы больше, чем его пишешь. Не усложняй себе работу.
2
-15 / 0 / 0
Регистрация: 12.11.2020
Сообщений: 349
08.07.2025, 08:14  [ТС]
Usaga, спасибо за советы.

Первые два абзаца несколько сложные для моего понимания из-за недостатка знаний. Но, если правильно понял смысл второго, для меня в основном нет проблем с пониманием своего кода при должных комментариях. И сейчас, когда понял, что можно и нужно использовать минификатор, не вижу проблем с написанием подробных комментариев. Думаю, при их наличии и другой, если такое потребуется, тоже сможет его понять при наличии желания.
Сложнее было при наличии большого количества файлов, понять в каком из них искать данную функцию или что-либо другое (например, классы)

Цитата Сообщение от Usaga Посмотреть сообщение
Автоподстановка лексем есть во всём, что сложнее Notepad.
Да, естественно знаю о ней, но мне лично она в основном не нравится и практически ею не пользуюсь (в основном только когда встречается незнакомое [длинное] слово на английском) - появляется меню, отвлекаться на него; проще, а часто и быстрее (думаю, что могу считать себя профессионалом по работе с клавиатурой ) набрать текст без ее использования с учетом того, что чаще копирую и переношу часть кода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.07.2025, 08:14
Помогаю со студенческими работами здесь

indexedDB get() возвращает пустой объект. А как получить значение по ключу?!
Доброго времени суток, только столкнулся с indexedDB, пробую по всяким (судя по всему второсортным)...

Сохранение множества значений в веб хранилище
Помогите с решением проблемы. Ниже код который сохраняет значение value в переменную var....

Локальное хранилище, бд
Добрый день, прошу помощи в поиске материалов, информации по теме &quot;js и локальное хранилище&quot;(может...

Работа с локальным хранилищем
Как я могу получить и записать в переменную, id кого-либо элемента?

Не работают события локальных хранилищ
Всем привет.У меня возникла проблема,что событие (window.onStorage) не вызывается при изменении в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru