【问题标题】:How to call a function of a react class from a service worker object?如何从服务工作者对象调用反应类的函数?
【发布时间】:2017-11-15 01:22:53
【问题描述】:

我正在尝试使用我自己的服务人员在反应网络中进行非侵入式更新。我想在网站有新更新时显示通知。我正在使用一个组件来处理服务工作者逻辑。问题是我不知道如何在服务工作者的事件侦听器中调用我的类的函数,其中 this 引用了服务工作者本身。有小费吗?这是处理 service worker 的类:

import * as React from 'react';
import { RouteComponentProps } from 'react-router';

export class ServiceWorker extends React.Component<RouteComponentProps<{}>> {
    constructor() {
        super();
    }

    registerServiceWorker() {
        if ('serviceWorker' in navigator) {
            window.addEventListener('load', () => {
                navigator.serviceWorker.register('/ServiceWorker.js').then(reg => {
                    console.log('SW registered: ', reg);
                    if (!navigator.serviceWorker.controller) {
                        return;
                    }
                    if (reg.waiting) {
                        console.log("update ready1");
                        //Can call updateAlert() here, because still using the same object
                        this.updateAlert();
                        return;
                    }

                    if (reg.installing) {
                        reg.installing.addEventListener('statechange', () => {
                            if (reg.installing.state == 'installed') {
                                console.log("update ready2");
                                //Can't call here
                                //this.updateAlert();
                            }
                        });
                        return;
                    }

                    reg.addEventListener('updatefound', function () {
                        reg.installing.addEventListener('statechange', () => {
                            if (reg.installing) {
                                if (reg.installing.state == 'installed') {
                                    console.log("update ready3");
                                    //or here
                                    //this.updateAlert();
                                }
                            }
                            if (reg.waiting) {
                                if (reg.waiting.state == 'installed') {
                                    console.log("update ready4");
                                    //or here
                                    //this.updateAlert();
                                }
                            }
                        });
                    })
                }).catch(registrationError => {
                    console.log('SW registration failed: ', registrationError);
                });
            });
        }
    }

    updateAlert() {
        console.log("success");
    }

    public render() {
        this.registerServiceWorker();
        return null;
    }
}

【问题讨论】:

    标签: javascript reactjs service-worker service-worker-events


    【解决方案1】:

    你或许可以尝试使用箭头函数来使用类的作用域:registerServiceWorker = () =&gt; { ... }

    顺便说一句,如果您只想添加一次事件侦听器,在渲染中调用this.registerServiceWorker(); 可能不是一个好主意,请尝试在componentDidMount 中调用它。

    【讨论】:

    • 更改为箭头函数(也需要更改事件侦听器函数)起到了作用,谢谢。另外,是的,打电话给componentDidMount 会更聪明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-30
    • 2020-02-03
    相关资源
    最近更新 更多