javascript - Slack Bolt 等待 ack() - 非同步
我正在嘗試使用 Slack 模態來實作任務創建工作流程。任務創建工作流程有時執行並生成結果需要超過 3 秒。因此,根據文檔,我在工作流程開始時呼叫了 await ack() 來確認,但 ack() 並未在工作流程開始時發送確認回應。相反,它是等到工作流程完成後才發送確認回應。
為了測試這個,我將工作流程替換為一個 sleep 語句,並在 sleep 之前使用 await 語句呼叫 ack() 函數。這段程式碼未能在 3 秒內確認。因此,Slack 應用程式顯示了一條錯誤訊息 enter image description here
// handle create task modal submission
app.view('create-task', async ({ ack, ...options }) => {
await ack()
logger.debug(`Sleeping ${new Date().getTime()}`);
await new Promise((r) => setTimeout(r, 5000));
logger.debug(`Woke up ${new Date().getTime()}`);
});
另一方面,如果我將睡眠間隔減少到 2 秒,上面的程式碼就能運行,並且不會出現錯誤。這表明確認是在工作流程完成之後發生的(回調函數已完全執行)。那麼,我如何在進入睡眠(任務創建工作流程)之前確認請求呢?
答案#1
你是否在 FaaS 上運行你的代碼時使用 AwsLambdaReceiver 或 processBeforeResponse: true 選項?如果是的話,這是 bolt-js 框架的預期行為。請參考 https://github.com/slackapi/bolt-js/issues/1119 了解其背景。
作為替代方法,我建議採取以下任一做法:
- 切換到非 FaaS 執行環境(=在 EC2 或容器服務中運行您的應用程式)
- 將耗時的部分分開執行(=在 SQS 中排隊任務或從對外網路的函數調用耗時部分的新 Lambda 函數)