Какова цель SwUpdate.activateUpdate () в Angular? - PullRequest
0 голосов
/ 03 апреля 2019

Угловая документация содержит следующий пример активации обновления ПО:

constructor(updates: SwUpdate) {
  updates.available.subscribe(event => {
    if (promptUser(event)) {
        updates.activateUpdate().then(() => document.location.reload());
    }
  });
}

Из того, что я наблюдаю, самого вызова недостаточно для активации новой версии, необходима перезагрузка. Однако document.location.reload() достаточно даже без вызова activateUpdate().

Какова цель звонка activateUpdate()? Зачем вообще звонить, когда перезагрузки хватает?

1 Ответ

0 голосов
/ 03 апреля 2019

Насколько я понимаю, из кода github activateUpdate() будет выполнять postMessage () для рабочего потока сервиса, чтобы сообщить ему о новых данных и статусе, и как только обещание будет разрешено (поток рабочего сервиса знает об этом), затем перезагрузите страницу.

https://github.com/angular/angular/blob/7.2.11/packages/service-worker/src/update.ts#L57-L64

activateUpdate(): Promise<void> {
    if (!this.sw.isEnabled) {
      return Promise.reject(new Error(ERR_SW_NOT_SUPPORTED));
    }
    const statusNonce = this.sw.generateNonce();
    return this.sw.postMessageWithStatus('ACTIVATE_UPDATE', {statusNonce}, statusNonce);
}

https://github.com/angular/angular/blob/master/packages/service-worker/src/low_level.ts#LC105

postMessageWithStatus(type: string, payload: Object, nonce: number): Promise<void> {
    const waitForStatus = this.waitForStatus(nonce);
    const postMessage = this.postMessage(type, payload);
    return Promise.all([waitForStatus, postMessage]).then(() => undefined);
}
...