Udostępnij za pośrednictwem


Zdarzenia renderowania w wizualizacjach usługi Power BI

Aby uzyskać certyfikat wizualizacji, musi zawierać zdarzenia renderowania. Te zdarzenia pozwalają odbiornikom (przede wszystkim eksportować do formatu PDF i eksportować do programu PowerPoint) wiedzieć, kiedy wizualizacja jest renderowana i kiedy jest gotowa do eksportu.

Ważne

Każda wizualizacja, która eksportuje dane (na przykład do pliku programu PowerPoint lub .pdf ), musi zawierać zdarzenia renderowania, aby upewnić się, że eksport nie rozpoczyna się przed zakończeniem renderowania wizualizacji.

Interfejs API zdarzeń renderowania składa się z trzech metod wywoływania podczas renderowania:

  • renderingStarted: Wywołaj tę metodę, aby wskazać, że rozpoczęto renderowanie. Zawsze należy wywołać tę metodę jako pierwszy wiersz metody aktualizacji, ponieważ rozpoczyna się proces renderowania.

  • renderingFinished: Wywołaj tę metodę po pomyślnym zakończeniu renderowania, aby powiadomić odbiorniki, że obraz wizualizacji jest gotowy do eksportu. To wywołanie powinno być ostatnim wierszem kodu, który jest uruchamiany , gdy wizualizacja zostanie zaktualizowana. Zazwyczaj jest to, ale nie zawsze, ostatni wiersz metody update.

  • renderingFailed: Wywołaj tę metodę, jeśli podczas renderowania wystąpi problem, aby powiadomić odbiorniki, że renderowanie nie zostało ukończone. Możesz przekazać opcjonalny ciąg, aby podać przyczynę błędu.

Uwaga

Zdarzenia renderowania są wymagane do certyfikacji wizualizacji. Bez nich wizualizacja nie zostanie zatwierdzona przez Centrum partnerskie do publikacji. Aby uzyskać więcej informacji, zobacz wymagania dotyczące certyfikacji.

Jak używać interfejsu API zdarzeń renderowania

Aby wywołać metody renderowania, najpierw zaimportuj IVisualEventService typ.

  1. visual.ts W pliku dodaj następujący import:

    import IVisualEventService = powerbi.extensibility.IVisualEventService;
    
  2. IVisual W klasie dodaj pole prywatne:

    private events: IVisualEventService;
    
  3. W metodzie constructor klasy zainicjuj IVisual pole:

    this.events = options.host.eventService;
    

Teraz możesz wywołać metodę this.events.renderingStarted(options);, this.events.renderingFinished(options);i this.events.renderingFailed(options); , jeśli jest to odpowiednie w metodzie update .

Cykl życia zdarzenia renderowania

Postępuj zgodnie z tymi regułami w każdym update() cyklu:

  1. Wywołanie renderingStarted po rozpoczęciu renderowania.
  2. Wywołaj dokładnie jedną metodę uzupełniania dla tego cyklu:
    • renderingFinished po pomyślnym zakończeniu renderowania lub
    • renderingFailed w przypadku niepowodzenia renderowania.
  3. W przypadku renderowania asynchronicznego wywołaj metodę renderingFinished dopiero po zakończeniu renderowania.

Ważne

Nie pozwól update() , aby metoda zakończyła się bez sygnalizowania ukończenia. Po wywołaniu renderingStartedmetody należy zawsze wywołać metodę renderingFinished lub renderingFailed.

Wzorce implementacji kodu

Aktualizacja synchroniczna z obsługą błędów

public update(options: VisualUpdateOptions): void {
  this.host.eventService.renderingStarted(options);

  try {
    this.renderView(options); // visual rendering logic
    this.host.eventService.renderingFinished(options);
  } catch (error) {
    this.host.eventService.renderingFailed(options, String(error));
    throw error;
  }
}

Aktualizacja asynchroniczna z obsługą błędów

public async update(options: VisualUpdateOptions): Promise<void> {
  this.host.eventService.renderingStarted(options);

  try {
    await this.renderAsync(options); // visual rendering logic
    this.host.eventService.renderingFinished(options);
  } catch (error) {
    this.host.eventService.renderingFailed(options, String(error));
    throw error;
  }
}

Łańcuch obietnic z .then().catch()

public update(options: VisualUpdateOptions): void {
  this.host.eventService.renderingStarted(options);

  this.renderAsync(options) // visual rendering logic
    .then(() => {
      this.host.eventService.renderingFinished(options);
    })
    .catch((error) => {
      this.host.eventService.renderingFailed(options, String(error));
      throw error;
    });
}