使用 $ 建立 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$() 呼叫中,使其以一秒的延遲更新。

編輯教學