簡體   English   中英

Javascript - 將匿名函數傳遞給 Promise.all

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM