Дубликат почтового запроса, отправленный работником сервиса - PullRequest
0 голосов
/ 23 октября 2018

Я только что нашел эту проблему, потому что пытался решить проблему с повторяющимся пост-запросом, когда использую workbox-background-sync.В моем веб-приложении есть функция загрузки фотографий.Но каждый раз я дважды загружал базу данных.Вот код, который у меня есть:

const bgSyncQueue = new workbox.backgroundSync.Queue(
        'photoSubmissions',
        {
            maxRetentionTime: 48 * 60,//48 hours
            callbacks: {
                queueDidReplay: function (requests) {
                    if (requests.length === 0) {
                        removeAllPhotoSubmissions();
                    }
                    else {
                        for(let request of requests) {
                            if (request.error === undefined && (request.response && request.response.status === 200)) {
                                removePhotoSubmission();
                            }
                        }
                    }
                }
            }
        });
    workbox.routing.registerRoute(
        new RegExp('.*\/Home\/Submit'),
        args => {
            const promiseChain = fetch(args.event.request.clone())
            .catch(err => {
                bgSyncQueue.addRequest(args.event.request);
                addPhotoSubmission();
                changePhoto();
            });
            event.waitUntil(promiseChain);
        },
        'POST'
    );

Может, потому что fetch(args.event.request.clone()).Если я его уберу, то дублирования больше не будет.Я использую рабочий ящик 3.6.1.

1 Ответ

0 голосов
/ 25 октября 2018

Наконец я нашел решение.Ниже мой код:

const photoQueue = new workbox.backgroundSync.Plugin('photoSubmissions', {
    maxRetentionTime: 48 * 60, // Retry for max of 48 Hours
    callbacks: {
        queueDidReplay: function (requests) {
            if (requests.length === 0) {
                removeAllPhotoSubmissions();
            }
            else {
                for(let request of requests) {
                    if (request.error === undefined && (request.response && request.response.status === 200)) {
                        removePhotoSubmission();
                    }
                }
            }
        }
    }
});

const myPhotoPlugin = {
    fetchDidFail: async ({originalRequest, request, error, event}) => {
                    addPhotoSubmission();
                    changePhoto();
    }
};

workbox.routing.registerRoute(
    new RegExp('.*\/Home\/Submit'),
    workbox.strategies.networkOnly({
        plugins: [
            photoQueue,
            myPhotoPlugin
        ]
    }),
    'POST'
);

Я удалил fetch.Если мы все еще хотим контролировать сами, нам нужно использовать respondWith().Я проверил это, это работает.Но я хотел бы использовать более рабочий способ для решения проблемы.Я использую workbox 3.6.3, и я создал свой собственный плагин для включения функции обратного вызова fetchDidFail для обновления моих представлений.Вот ссылки, которые я нашел: один и два .Повторных сообщений больше нет.

...