Отзыв о сохранении данных Firestore в Интернете в автономном режиме

Я ищу способ оставить отзыв пользователю моего веб-приложения Firebase/Firestore в автономном режиме. Давайте посмотрим код.

var colRef = db.collection('collectionName').doc('anyDoc');
var setWithMerge = colRef.set({
     'value': 'someValue',
 }, {
     merge: true
 })
 .then(function () {
     alert('Success');
 })
 .catch(function (error) {
     alert("Fail :" + error);
 });

Онлайн: вызовите функцию, и оповещение об успешном выполнении будет работать идеально.

Не в сети: вызовите функцию, и ничего не произойдет. Но когда пользователь выходит в интернет, приложение показывает все оповещения подряд.

Короче говоря, .then часть кода работает только онлайн. Мне нужна какая-то обратная связь для автономного пользователя.


person gillall    schedule 18.11.2017    source источник


Ответы (2)


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

var colRef = db.collection('collectionName').doc('anyDoc');
var setWithMerge = colRef.set({
     'value': 'someValue',
 }, {
     merge: true
 })
 alert("Value set");
person Frank van Puffelen    schedule 18.11.2017
comment
Но можете ли вы быть абсолютно уверены, что даже локальная запись на этом этапе завершена? Записываются ли данные до того, как будет возвращено (невыполненное) обещание? - person DarkNeuron; 28.11.2017
comment
Я описал, как должна вести себя система. Если вы обнаружите поведение, которое противоречит тому, что я сказал, опубликуйте или сообщите об ошибке. отчет. - person Frank van Puffelen; 28.11.2017
comment
У нас нет, просто интересно. Полезно знать, как это должно работать. - person DarkNeuron; 28.11.2017
comment
Привет, ну мне тяжело с таким поведением. Проблема в том, что я сохраняю, и в конце этой цепочки мне нужен ответ с идентификатором, чтобы сохранить связанные данные. У меня нет обратной связи или ответа о сохранении, как я могу завершить цепочку сохранения. О других случаях, мне нужна обратная связь, чтобы я мог закрыть представление или что-то сделать. Может быть, я что-то здесь упускаю. - person Pablo Palacios; 18.12.2018

Спасибо @Frank, @Blackwood. Я изменил оповещения на неблокирующие уведомления.

function doSomething() {
try {
    var colRef = db.collection('collectionName').doc('anyDoc');
    var setWithMerge = colRef.set({
            'value': 'someValue',
        }, {
            merge: true
        })
        .then(function () {
            alertify.notify('Data saved online.', 'success', 5);
        })
        .catch(function (error) {
            alert('Error: ' + error);//or
            //alertify.notify('Data saved online.', 'error', 10);
        });
    alertify.notify('Data saved on cache.', 'warning', 5);
} catch (error) {
    alert('Error: ' + error);
}}

В сети: вызывает функцию и запускает 2 уведомления (в кэше и онлайн) почти одновременно.

В автономном режиме: вызывает функцию, запускает 1 уведомление, и когда пользователь выходит в сеть, приложение показывает все ожидающие онлайн-уведомления подряд.

Очень приемлемое поведение. Я не говорю по-английски, простите мои ошибки.

person gillall    schedule 19.11.2017