使用 $ 建立 API
Optimizer 的一個強大功能是您可以使用 $
後綴建立自己的 API。
假設我們想要一個可以延遲載入其回調的 delay 方法。通常我們必須這樣寫
setTimeout(() => {
// I am eagerly loaded, but it would be better if I was lazy-loaded.
...
}, timeout);
上面範例的問題是必須先下載並建立回調。如果閉包很大,或者從未執行回調(或者只在稍後執行),這可能會是一個問題。
更好的解決方案是使用可以延遲載入與回調關聯的閉包的 delay$
方法。像這樣。
delay$(() => {
// I am lazy-loaded only when I need to be executed.
...
}, 1000)
在上述解決方案中,僅在 delay$
準備好執行時才會下載回調。
$
後綴建立您的 API
使用 Qwik 執行時間使用 QRL
。因此我們定義了一個方法,如下所示
export function delayQrl<T>(fn: QRL<() => T>, delayInMs: number): Promise<T> {
return new Promise((res) => {
setTimeout(() => {
res(fn.invoke());
}, delayInMs);
});
}
這個方法知道如何取得 QRL
並在一定延遲後執行它。這裡的關鍵部分是在延遲準備就緒時呼叫 QRL.invoke()
方法,因此是延遲的。
下一步是將 delayQrl
方法轉換為 delay$
別名。這是使用 implicit$FirstArg
完成的,如下所示
export const delay$ = implicit$FirstArg(delayQrl);
以下是類型,以更清楚地說明發生了什麼。
declare function delayQrl<T>(fn: QRL<() => T>, delayInMs: number): Promise<T>;
declare function delay$<T>(fn: () => T, delayInMs: number): Promise<T>;
以上允許我們以內嵌方式使用 delay$
,但 Optimizer 會將 delay$
轉換為 delayQrl
形式。
**注意**這兩種方法必須具有相同的前綴。所以一般形式是
export const SOME_NAME_Qrl = ...;
export const SOME_NAME_$ = implicit$FirstArg(SOME_NAME_Qrl);
範例
在我們的範例中,我們同時執行了 store.count++
和 store.delay++
。將 store.delay
包裝在 delay$()
呼叫中,使其以一秒的延遲更新。