[英]Javascript - Pass anonymous functions to Promise.all
我正在嘗試使用帶有 Axios 的 Promise.all 方法同時進行多個 API 調用,基於以下示例:
getUsers() {
return axios.get('/users');
}
getSessions() {
return axios.get('/sessions');
}
Promise.all([getUsers(), getSessions()])
.then(results => {
// Use the data
})
.catch(error => {
// Catch the error
});
但是,由於我只會根據 Promise 鏈中先前 API 調用的結果知道在此階段需要進行哪些並發 API 調用,因此我試圖將一組匿名函數傳遞給表單中的函數的:
var array = [];
array.push(() => {return axios.get('/users')});
array.push(() => {return axios.get('/sessions')});
Promise.all(array).then....
這不起作用,我知道這是因為我傳遞的是函數對象,而不是像方法所期望的那樣引用實際的 Promise 對象。 但是,僅將 axios.get(...) 方法推送到數組會導致立即調用它們,而不是稍后執行 Promise.all 方法。
我不確定如何正確地做到這一點,或者是否有更好的方法來實現我所追求的......
我不熟悉 Axios,但如果我理解正確, axios.get
返回一個Promise
,這是Promise.all
所需要的。 怎么樣:
Promise.all(array.map(f => f()).then....
這樣你的函數會在你真正想要的時候被調用, map
會給你一個結果數組,所以一個Promise
數組。
請注意,這與您使用[getUsers(), getSessions()]
引用的示例基本相同 - 不同之處在於您的函數是匿名的,並且使用map
隱式調用,而不是通過它們的名稱顯式調用。 通過這種方式,您可以更靈活地實際調用哪些函數。
基本上,在最簡單的情況下,要將匿名函數用作包裝器,您需要在將其放入 Promise.all之前調用它。
所以只是嘗試:
const f = async () => {return service.myFunc();}
Promise.all([f()])
因此,您的包裝器 (f) 之前調用過,並且您正在為數組提供一個 Promise。
或
Promise.all([(async () => {const result = await service.myFunc(); return result;})()]);
或(等於):
const myPromise = (async () => {const result = await service.myFunc(); return result;})();
Promise.all([myPromise]);
所以 Promise 將提供給 Promise.all,而不僅僅是原始函數。 另外,要小心,不要忘記在“大匿名函數體”的情況下使用await
。
很長一段時間以來,我一直在為此撓頭。 在第一個示例中,您在此處調用函數:
Promise.all([getUsers(), getSessions()])
但在第二個中,匿名函數只是被聲明,從未被調用:
array.push(()=>{return axios.get('/users')});
所以你需要這樣做並在你推送它們時調用它們:
array.push( (()=>{return axios.get('/users')}) () );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.