假設我有一個功能fetch(id)
。創建一個函數,無論調用多少次只在第一次異步調用結束時運行?
我會在任意時間任意調用它。
但我希望每一個連續的調用只有在前一個調用完成後才能運行。
說異步任務需要4秒,我打電話fetch
3次。那麼總時間應該是12秒。
我可以創建一個數組,並且在每個調用集中都承諾接下來的行。
但有什麼辦法可以做到這一點。
假設我有一個功能fetch(id)
。創建一個函數,無論調用多少次只在第一次異步調用結束時運行?
我會在任意時間任意調用它。
但我希望每一個連續的調用只有在前一個調用完成後才能運行。
說異步任務需要4秒,我打電話fetch
3次。那麼總時間應該是12秒。
我可以創建一個數組,並且在每個調用集中都承諾接下來的行。
但有什麼辦法可以做到這一點。
我想我得到了它
//First my example function which could be anything but should return promise which would be queued
function example(n) {
return new Promise((res, rej) => {
setTimeout(()=> {
console.log(n);
res();
}, 1000);
});
}
//now solution
function debounce(func) {
let p = Promise.resolve();
return function(x){
p = p.then(() => func(x));
}
}
//usage
d = debounce(example);
d(1);d(2);d(3);d(4);d(5);d(6);d(1);
您可以鏈的承諾沒有一個數組,只是一個指針存儲到最後無極
// async payload function
// returns a promise
function f(x) {
console.log(`call f(${x})`);
return new Promise((resolve) => {
setTimeout(() => {
console.log(`resolve f(${x})`);
resolve();
}, 2000);
});
}
// wrapper to call function `f` sequentially
// stores pointer to the last Promise in closure
const g = (function(){
let lastPromise = Promise.resolve();
return function(arg){
lastPromise = lastPromise.then(() => f(arg));
}
})();
// generate random calls of function function `g`
for (let i = 0; i < 5; i++) {
setTimeout(() => g(i), Math.random() * 100);
}
哇我來到相同的解決方案,你可以使用Promise.resolve(),它會立即運行,所以不會需要條件 –
你是對的,我已經更新了我的代碼片段 –
是的,一個承諾隊列會是個好辦法。 – Bergi