2017-09-25 74 views
0

假設我有一個功能fetch(id)創建一個函數,無論調用多少次只在第一次異步調用結束時運行?

我會在任意時間任意調用它。

但我希望每一個連續的調用只有在前一個調用完成後才能運行。

說異步任務需要4秒,我打電話fetch 3次。那麼總時間應該是12秒。

我可以創建一個數組,並且在每個調用集中都承諾接下來的行。

但有什麼辦法可以做到這一點。

+0

是的,一個承諾隊列會是個好辦法。 – Bergi

回答

0

我想你可以使用async.io庫。 或者,每次你想調用你的函數時,都可以將這個函數本身推入一個數組中。當前一個函數完成時,檢查是否還有一些函數要在數組中調用。

+0

*如何使用async.js?這裏有一堆功能,這在這裏絕對沒用。 – Bergi

1

我想我得到了它

//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); 
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); 
} 
+1

哇我來到相同的解決方案,你可以使用Promise.resolve(),它會立即運行,所以不會需要條件 –

+0

你是對的,我已經更新了我的代碼片段 –

相關問題