Не видно переменных после функции
var tokens; var token; function logerr(err) { console.log('Database erroor: ',err); } function connectDB(f) { const request = indexedDB.open('library', 1); request.onerror = logerr; request.onsuccess = function() { f(request.result); }; request.onupgradeneeded = function(e) { e.currentTarget.result.createObjectStore('users', { keyPath: 'uid' }); connectDB(f); }; } connectDB(db => { var tx = db.transaction("users", "readonly"); var store = tx.objectStore("users"); var index = store.index("by_title"); var request = index.get("my"); request.onsuccess = function() { var matching = request.result; if (matching !== undefined) { // A match was found. Вот тут я вижу в консоли значение matching.uid console.log ( 'DB - ' + matching.uid ); Присваиваю вроде как значение переменным tokens = matching.uid ; token = matching.uid ; } else { // No match was found. console.log ( 'DB null' ); } }; }); console.log("Token 1 " + token + " Token 2 " + tokens ); Тут уже в консоли вижу пустоту изначальную Token 1 undefined Token 2 undefined Куда делось присвоение, как вытащить данные? |
ну и вызывай какую-нибудь ф-цию "там", где они есть )...
|
Это всё происходит внутри Service Workera
и данные видно в функции, но уже после обработки запроса.. Нужно как то заморозить остальное выполнения кода, до получения этих данных.. |
Так вам нужно дождаться конца, а затем только использовать...
function logerr(err) { console.log('Database error: ', err); } function connectDB() { return new Promise((resolve, reject) => { const request = indexedDB.open('library', 1); request.onerror = reject; request.onsuccess = () => resolve(request.result); request.onupgradeneeded = async e => { e.currentTarget.result.createObjectStore('users', { keyPath: 'uid' }); resolve(await connectDB()); }; }); } connectDB().then(db => new Promise((resolve, reject) => { var tx = db.transaction("users", "readonly"); var store = tx.objectStore("users"); var index = store.index("by_title"); var request = index.get("my"); request.onsuccess = () => { var matching = request.result; if (matching !== undefined) { // A match was found. // Вот тут я вижу в консоли значение matching.uid console.log('DB - ' + matching.uid); // Присваиваю вроде как значение переменным resolve(matching.uid); } else { // No match was found. console.log('DB null'); reject(); } }; })).catch(logerr).then(token => { console.log("Token 1 " + token + " Token 2 " + token); });Должно работать, если только я не сделал ошибки! Работает? |
Говорит:
connectDB(...) is undefined TypeError: f is not a function |
Цитата:
|
Как бы тут причина в другом... работать оно как бы работает, но проблема
в другом выходит... Я при подписке юзера на пуш в IndexDB сохраняю его uid потом хотел при отправке через это messaging.setBackgroundMessageHandler(function(pay load) { поменять урл на data: payload.data.click_action + user_id, В хроме на десктопе работает через раз... В Фоксе не видит он user_id На мобилке Хром тоже не понимает что он него хотят)) В итоге не получается изменить урл чтобы идентифицировать юзера который посмотрел этот пушш.. ++ Думал с другим костылем пойти: Регистрирую сервис воркер navigator.serviceWorker.register('/firebase-messaging-sw.js?uid=blabla123); Вижу в консоле воркер - firebase-messaging-sw.js?uid=blabla123 Не могу с него получить uid let params = (new URL(self.location)).searchParams; let uid = params.get('uid'); console.log( 'URL = ' + uid ); var user_id = "1513" + "&token=" + uid ; Хром говорит: URL = null |
Часовой пояс GMT +3, время: 16:03. |