我的頁面應該盡快從后端 (Contentful.com) 加載內容。我在一個額外的服務中加載后端內容,該服務在我的根模塊中注冊。我如何確保getContent()盡快呼叫此服務中的函式?:
import { Injectable } from '@angular/core';
import {environment} from 'src/environments/environment.local';
@Injectable({
providedIn: 'root'
})
export class GetContentService {
constructor() { }
getContent() {
loadingMyContentIntoAnObservable.then(content =>
console.log("received the content", content");
}
}
我的想法是創建一個 Home 組件,該組件在建構式中具有服務,然后在ngOnInit()此組件呼叫中getContentService.getContent()。但這是最快的方式嗎?(我知道這只是幾毫秒的事情,但我想學習正確/最好的方法......)
uj5u.com熱心網友回復:
如果您想在應用程式啟動之前呼叫后端作為引導的一部分,您可以使用APP_INITIALIZER。
用法:
function initializeApp(): Promise<any> {
return new Promise((resolve, reject) => {
// Do some asynchronous stuff
resolve();
});
}
@NgModule({
imports: [BrowserModule],
declarations: [AppComponent],
bootstrap: [AppComponent],
providers: [{
provide: APP_INITIALIZER,
useFactory: () => initializeApp,
multi: true
}]
})
export class AppModule {}
但是您必須意識到這會延遲應用程式的啟動時間,而且大多數情況下這不是您想要的,因為您無法向呼叫您的應用程式的用戶提供有意義的視覺反饋。
uj5u.com熱心網友回復:
這會起作用,盡管在服務的建構式中發送請求可能更容易:
export class GetContentService {
constructor() {
loadingMyContentIntoAnObservable.then(content =>
console.log("received the content", content");
}
}
但是,盡可能早地發送請求并不意味著回應會立即到達(或者根本不會;請求可能會失敗),因此您仍然需要處理在請求傳輸程序中資料不可用的問題。
PS:是的,您可以等到回應到達后再初始化 angular,但這會延遲您的應用程式第一次有意義的渲染的時間,并且會導致用戶認為您的應用程式很慢。最好立即渲染盡可能多的內容,并且只隱藏那些真正需要獲取資料的功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/345441.html
標籤:有角的
