我想要一個異步函式來向服務器發送請求并等待回應。然后它將等待 1000 毫秒以確保影片播放完畢。我想知道我是否可以以某種方式組合這兩個任務,這樣它們加起來總共動態等待了 1000 毫秒。
我目前的代碼:
const loadingHandler = async (func, target) => {
setIsLoading(true);
await new Promise(r => setTimeout(r, 1000));
await func(target);
setIsLoading(false);
};
一些示例來進一步解釋我的意思:函式呼叫func()并在(假設)200 毫秒后獲得回應。現在超時只應該是 800 毫秒。如果func()在 20 毫秒后回傳,則超時應為 980 毫秒。如果func()花費的時間超過 1000 毫秒,它應該在收到回應后立即繼續,而不是額外等待。那么像這樣的“擔架等待功能”可能嗎?
uj5u.com熱心網友回復:
當然,只要記住到目前為止已經過了多長時間,然后再延遲更長的時間:
const loadingHandler = async (func, target) => {
setIsLoading(true);
const started = Date.now();
await func(target);
const elapsed = Date.now() - started;
const delayFurther = 1000 - elapsed;
if (delayFurther > 0) {
await new Promise(r => setTimeout(r, delayFurther));
}
setIsLoading(false);
};
也就是說,因為影片尚未完成而阻止用戶可能不是最好的用戶體驗。也許您可以在影片完成后更快地func完成。(人類往往會注意到延遲 > 大約 80-100 毫秒,當我們年輕時會少一點。)
uj5u.com熱心網友回復:
克勞德先生完美有效的解決方案的替代方案:與其等待承諾完成,然后檢查我們是否需要開始一個新的承諾,不如同時開始兩個承諾并等待它們兩個。具有相同的效果,但使代碼更短:
const loadingHandler = async (func, target) => {
setIsLoading(true);
await Promise.all([
func(target),
new Promise(r => setTimeout(r, 1000)),
]);
setIsLoading(false);
}
uj5u.com熱心網友回復:
在您的代碼中,您首先啟動 promise(間隔),等待它完成,然后啟動第二個(func)并等待完成。你應該開始兩個承諾并一起等待。
const loadingHandler = async (func, target) => {
setIsLoading(true);
const p1 = new Promise(r => setTimeout(r, 1000));
const p2 = func(target);
await Promise.all([p1,p2]);
setIsLoading(false);
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/365779.html
標籤:javascript 反应 异步等待
