Вход

Просмотр полной версии : Не видно переменных после функции


HelloIm
15.05.2019, 21:20
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

Куда делось присвоение, как вытащить данные?

SuperZen
15.05.2019, 21:25
ну и вызывай какую-нибудь ф-цию "там", где они есть )...

HelloIm
15.05.2019, 22:44
Это всё происходит внутри Service Workera
и данные видно в функции, но уже после обработки запроса..
Нужно как то заморозить остальное выполнения кода, до получения этих данных..

Malleys
15.05.2019, 23:24
Так вам нужно дождаться конца, а затем только использовать...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);
}); Должно работать, если только я не сделал ошибки! Работает?

HelloIm
15.05.2019, 23:36
Говорит:

connectDB(...) is undefined
TypeError: f is not a function

Malleys
16.05.2019, 00:00
connectDB(...) is undefined
Попробуйте ещё раз, скопируйте весь код выше. А то у вас что-то не то, у меня там же написано, что connectDB возвращает промис, оно не может возвратить undefined. Может у вас осталось старое connectDB?

HelloIm
16.05.2019, 02:55
Как бы тут причина в другом... работать оно как бы работает, но проблема
в другом выходит...
Я при подписке юзера на пуш в 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