根據核心元件在最適化表單中使用非同步函式

最適化Forms🔗中的規則編輯器支援非同步功能,可讓您整合和管理需要等待外部程式或資料擷取的作業,而不會中斷使用者與表單的互動。

使用非同步或同步功能取決於哪些因素?

有效管理使用者互動對於建立順暢的體驗至關重要。 處理操作的兩種常見方法是同步和非同步函式。

同步功能 ​會逐一執行工作,導致應用程式等待每個作業完成後再繼續。 這可能會導致延遲和較少參與的使用者體驗,尤其是當任務涉及等待外部資源(例如檔案上傳或資料擷取)時。

例如,假設使用者上傳影像,整個表單會暫停,等候上傳完成。 此暫停會讓使用者無法與其他欄位互動,導致挫折感和延遲。 當他們等待影像處理時,如果導覽到別處或失去耐心,所輸入的任何資訊都可能會遺失,導致體驗繁瑣且效率低下。

非同步函式,另一方面,允許同時執行工作。 這表示在執行背景程式時,使用者可以繼續與應用程式互動。 非同步操作可增強回應能力,讓使用者能立即收到意見回饋,並保持參與而不受干擾。

相反地,使用者可以非同步方式上傳背景影像,同時繼續無縫填寫表單的其餘部分。 介面保持回應式,允許即時更新,並可在上傳過程中即時提供意見反應。 它可提升使用者參與度,確保暢通無阻的體驗。

非同步和同步功能 {align="center"}

為Adaptive Forms實作非同步函式

您可以在規則編輯器中使用下列規則型別,實作最適化Forms的非同步函式:

如何使用非同步函式呼叫規則型別?

您可以撰寫非同步作業的自訂函式,並使用規則編輯器中的​ 非同步函式呼叫 ​規則型別來設定非同步函式。

透過使用案例探索Async函式呼叫規則型別

考慮在使用者輸入一次性密碼(OTP)的網站上建立登錄檔格。 只有在輸入正確的OTP後,才會顯示新增使用者詳細資訊的面板。 如果OTP不正確,面板會保持隱藏狀態,且熒幕上會顯示錯誤訊息。

登入表單

在登錄檔單中,當使用者按一下​ Confirm ​按鈕時,將會以非同步方式呼叫matchOTP()函式以驗證輸入的OTP。 matchOTP()函式已實作為自訂函式。 使用規則編輯器中的​ 非同步函式呼叫 ​規則型別,您可以在適用性表單的規則編輯器中設定matchOTP()函式。 您也可以在規則編輯器中實作成功和失敗回呼。

下圖說明使用​ 非同步函式呼叫 ​規則型別來叫用最適化Forms非同步函式的步驟:

新增非同步函式的工作流程 {align="center" width="50%,"}

1.為JS檔案中的非同步作業寫入自訂函式

NOTE

matchOTP()函式已實作為自訂函式。 下列程式碼會新增至自訂函式的JS檔案中:

/**
 * generates the otp for success use case
 * @param {string} otp
 * @return {PROMISE}
 */
function matchOTP(otp) {
     return new Promise((resolve, reject) => {
        // Perform some asynchronous operation here
         asyncOperationForOTPMatch(otp, (error, result) => {
            if (error) {
                // On failure, call reject(error)
                reject(error);
            } else {
                // On success, call resolve(result)
                resolve(result);
            }
        });
    });
}

/**
 * generates the otp
 */
function asyncOperationForOTPMatch(otp, callback) {
    setTimeout(() => {
        if(otp === '111') {
            callback( null, {'valid':'true'});
        } else {
            callback( {'valid':'false'}, null);
        }
    }, 1000);
}

程式碼定義函式matchOTP(),該函式會產生Promise以非同步方式驗證一次性密碼(OTP)。 它使用函式asyncOperationForOTPMatch()來模擬OTP比對程式。 此函式檢查提供的OTP是否等於111。 如果輸入的OTP正確,它會呼叫錯誤為null的回呼,以及指示OTP有效為({'valid':'true'})的物件。如果OTP無效,則會呼叫結果為null且錯誤物件為({'valid':'false'})的回呼。

2.在規則編輯器中設定非同步函式

執行以下步驟,在規則編輯器中設定非同步函式:

2.1建立規則以使用非同步函式呼叫規則型別來使用非同步函式

若要建立規則以使用非同步作業,請使用​ 非同步函式呼叫 ​規則型別,請執行下列步驟:

  1. 以編寫模式開啟最適化表單,選取表單元件,然後選取​ 規則編輯器 ​以開啟規則編輯器。
  2. 選取「建立」。
  3. 在規則的​ When ​區段中建立條件,以點選按鈕。 例如,按一下​ When[Confirm]
  4. 在​ 然後 ​區段中,從​ 選取動作 ​下拉式清單中選取​ 非同步函式呼叫
    當您選取​ 非同步函式呼叫 ​時,就會顯示具有Promise傳回型別的函式。
  5. 從清單中選取非同步函式。 例如,選取matchOTP()函式,其回呼會顯示為Add success callbackadd failure callback
  6. 現在選取​ 輸入 ​繫結。 例如,選取​ 輸入 ​作為Form Object,並將其與OTP欄位進行比較。

底下熒幕擷圖顯示規則:

規則型別

現在,您可以繼續實作matchOTP函式的SuccessFailure回呼。

2.2為非同步函式實作回呼

使用視覺化規則編輯器為非同步函式實作成功和失敗回呼方法。

Add Success callback方法建立規則

如果OTP符合值111,讓我們建立規則以顯示userdetails面板。

  1. 按一下​ 新增成功回呼

  2. 按一下​ 新增陳述式 ​以建立規則。

  3. 在規則的​ When ​區段中建立條件。

  4. 選取​ 函式輸出 > 取得事件承載

    note note
    NOTE
    Get Event Payload ​函式會擷取與特定事件相關的資料,以動態管理使用者互動。
  5. 從​ Input ​區段選取其對應的繫結。 例如,選取​ 字串 ​並輸入valid。 比較輸入的字串與true

  6. 在​ 然後 ​區段中,從​ 選取動作 ​下拉式清單中選取​ 顯示。 例如,顯示userdetails面板。

  7. 按一下​ 新增陳述式

  8. 從​ 選取動作 ​下拉式清單中選取​ 隱藏。 例如,隱藏error message文字方塊。

  9. 按一下​ 「完成」

成功呼叫 {width="50%,"}

請參考下方的熒幕擷圖,其中使用者以111身分進入OTP,且按一下Confirm按鈕時就會顯示User Details面板。

成功

Add Failure callback方法建立規則

讓我們建立一個規則,在OTP不符合值111時顯示失敗訊息。

  1. 按一下​ 新增失敗回呼

  2. 按一下​ 新增陳述式 ​以建立規則。

  3. 在規則的​ When ​區段中建立條件。

  4. 選取​ 函式輸出 > 取得事件承載

  5. 從​ Input ​區段選取其對應的繫結。 例如,選取​ 字串 ​並輸入valid。 比較輸入的字串與false

  6. 在​ 然後 ​區段中,從​ 選取動作 ​下拉式清單中選取​ 顯示。 例如,顯示error message文字方塊。

  7. 按一下​ 新增陳述式

  8. 從​ 選取動作 ​下拉式清單中選取​ 隱藏。 例如,隱藏userdetails面板。

  9. 按一下​ 「完成」

失敗回呼方法 {width="50%,"}

請參考下方的熒幕擷圖,其中使用者以123身分進入OTP,且按一下Confirm按鈕時會顯示錯誤訊息。

失敗

下面的熒幕擷圖顯示使用​ 非同步函式呼叫 ​實作非同步函式的完整規則:

非同步函式呼叫的 規則

您也可以按一下​ 編輯成功回呼 ​和​ 編輯失敗回呼 ​來編輯回呼。

如何使用函式輸出規則型別?

您也可以使用同步函式間接呼叫非同步函式。 同步函式是使用最適化表單的規則編輯器中的​ 函式輸出 ​規則型別執行。

檢視下列程式碼,瞭解如何使用​ 函式輸出 ​規則型別來叫用非同步函式:


    async function asyncFunction() {
    const response = await fetch('https://petstore.swagger.io/v2/store/inventory');
    const data = await response.json();
    return data;
    }

    /**
    * callAsyncFunction
    * @name callAsyncFunction callAsyncFunction
    */
    function callAsyncFunction() {
    asyncFunction()
        .then(responseData => {
        console.log('Response data:', responseData);
        })
        .catch(error => {
         console.error('Error:', error);
    });
}

在上述範例中,asyncFunction函式是asynchronous function。 它透過向https://petstore.swagger.io/v2/store/inventory發出GET請求來執行非同步操作。 它會使用await等待回應、使用response.json()將回應本文剖析為JSON,然後傳回資料。 callAsyncFunction函式是同步自訂函式,會叫用asyncFunction函式並在主控台中顯示回應資料。 雖然callAsyncFunction函式是同步的,但它會呼叫非同步asyncFunction函式,並以thencatch陳述式處理其結果。

若要檢視其運作情況,讓我們新增按鈕,並為按鈕建立規則,此規則會在按鈕按一下時叫用非同步函式。

為非同步函式建立規則 {width="50%"}

請參考下方主控台視窗的熒幕擷圖,以示範當使用者按一下Fetch按鈕時,會叫用自訂函式callAsyncFunction,進而呼叫非同步函式asyncFunction。 檢查主控台視窗以檢視按鈕點選的回應:

主控台視窗

另請參閱

recommendation-more-help
fbcff2a9-b6fe-4574-b04a-21e75df764ab