2

サービスワーカーを使用してプッシュ通知に取り組んでいます。XHR(Ajax) アプローチを使用して通知を取得しています。service-worker.js のコード スニペットは次のとおりです。

 var API_ENDPOINT = new Request('/getNotification', {
redirect: 'follow'});

event.waitUntil(
    fetch(API_ENDPOINT, {credentials: 'include' })
        .then(function(response) {

            console.log(response);
            if (response.status && response.status != 200) {
                // Throw an error so the promise is rejected and catch() is executed
                throw new Error('Invalid status code from API: ' +
                    response.status);
            }
            // Examine the text in the response
            return response.json();
        })
        .then(function(data) {
            console.log('API data: ', data);

            var title = 'TEST';
            var message = data['notifications'][0].text;
            var icon = data['notifications'][0].img;

            // Add this to the data of the notification
            var urlToOpen = data['notifications'][0].link;

            var notificationFilter = {
                tag: 'Test'
            };

            var notificationData = {
                url: urlToOpen,
                parsId:data['notifications'][0].parse_id
            };

            if (!self.registration.getNotifications) {
                return showNotification(title, message, icon, notificationData);
            }

        })
        .catch(function(err) {
            console.error('A Problem occured with handling the push msg', err);

            var title = 'An error occured';
            var message = 'We were unable to get the information for this ' +
                'push message';

            return showNotification(title, message);
        })
);

このコードは、最初に curl を実行したときは問題なく動作しますが、2 回目にコンソールでエラーが発生しました。

Failed to execute 'fetch' on 'ServiceWorkerGlobalScope': Cannot construct a Request with a Request object that has already been used

これは何を意味するのでしょうか?

4

2 に答える 2

7

問題は、API_ENDPOINTが によってすでに消費されていることfetch()です。フェッチするために渡すたびに新しいリクエスト オブジェクトが必要になるため、使用する前にクローンを作成します。

fetch(API_ENDPOINT.clone(), { credentials: 'include' })...
于 2016-02-15T16:58:35.530 に答える
2

Request オブジェクトを複数回再利用しないでください。

fetch('/getNotification', {
  credentials: 'include',
  redirect: 'follow'
})
于 2016-02-15T16:56:14.497 に答える