Javascript navigator.serviceWorker.controller.postMessage为空,但仅在第一页加载时为空

Javascript navigator.serviceWorker.controller.postMessage为空,但仅在第一页加载时为空,javascript,service-worker,Javascript,Service Worker,在第一次页面加载时(清空IndexDB、缓存并注销service worker后)或在没有缓存的情况下重新加载时(Ctrl+F5),我会遇到以下错误: Uncaught (in promise) TypeError: Cannot read property 'postMessage' of null 对于服务人员的每一条post消息,此错误都会持续出现。直到我再次重新加载页面(使用缓存)。这不是比赛条件。只是第一次加载页面时出现了一些问题 我只是不明白是什么。有什么提示吗?谷歌什么都没想到

在第一次页面加载时(清空IndexDB、缓存并注销service worker后)或在没有缓存的情况下重新加载时(Ctrl+F5),我会遇到以下错误:

Uncaught (in promise) TypeError: Cannot read property 'postMessage' of null
对于服务人员的每一条post消息,此错误都会持续出现。直到我再次重新加载页面(使用缓存)。这不是比赛条件。只是第一次加载页面时出现了一些问题

我只是不明白是什么。有什么提示吗?谷歌什么都没想到

导致它的代码如下所示:

const loadUUID = (callback, storename, data) => {
    let request = window.indexedDB.open(DBN, DBN_VERSION), db, tx, store, index;

    request.onerror = e => {
        console.log('request.onerror');
        console.log(e);
    };

    request.onsuccess = e => {
        db = request.result;
        tx = db.transaction('uuid', 'readonly');
        store = tx.objectStore('uuid');
        let cursor = store.openCursor(null, 'next');
        var mostRecent = null;

        cursor.onsuccess = e => {
            if (e.target.result) {
                mostRecent = e.target.result.value.uuid;
            }
        };


        tx.oncomplete = e => {
            db.close();
            if (data) {
                data.uuid = mostRecent;
                //navigator.serviceWorker.controller.postMessage(data);
                navigator.serviceWorker.ready.then(serviceworkerRegistration => {
                    console.log('within ready');
                    return serviceworkerRegistration.pushManager.getSubscription();

                })
                .then(subscription => {
                    if (!subscription) {
                        console.log('subscription MISSING');
                    }
                    console.log('within then of subscription');
                    navigator.serviceWorker.controller.postMessage(data); //line triggering the error

                });
            } else {
                callback(mostRecent);
            }
        };
    };
    request.onupgradeneeded = e => {
        let db = request.result;
        STORES.forEach(storename => {
            if (!db.objectStoreNames.contains(storename)) {
                db.createObjectStore(storename, {autoIncrement: true});
            }
        });
    };
};

注释掉的行导致完全相同的问题。我认为这可能是一个比赛条件,因此建议等待SW准备就绪。但这对我的情况没有帮助。

这似乎起到了作用:

        navigator.serviceWorker.ready.then(worker => {
            worker.active.postMessage(loggingdata); 
        });

,如果请求是强制刷新(Shift+refresh)或没有活动的工作进程,则“属性返回
null
”。因此,代码中的某个地方服务进程正在变为非活动状态。根据开发人员工具→应用程序选项卡→服务工作者(在Chrome中),服务工作者被激活并正在运行。我刚刚验证了这一点,并通过在网页上点击触发了一些postMessage调用,错误不断出现。并且:这发生在navigator.serviceworner.read中。如果服务人员有任何问题,代码应该在之前的某个地方发生冲突,而不是在这个防御性最强的代码块之后。我的意思是,强制重新加载的行为与MDN中记录的一样。但是为什么呢?这使得web应用程序在强制重新加载后无法正常运行。