Javascript - 将匿名函数传递给Promise.all

时间:2018-04-08 18:22:46

标签: javascript arrays promise axios es6-promise

我正在尝试使用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方法时。

我不确定如何正确地做到这一点,或者是否有更好的方法来实现我所追求的......

2 个答案:

答案 0 :(得分:4)

我对Axios不熟悉,但如果我理解正确axios.get,则会返回Promise Promise.all所需的内容。怎么样:

Promise.all(array.map(f => f()).then....

这样你的函数就会在你真正想要的时候调用,而map会给你一个结果数组,所以Promise的数组。

请注意,这与您在[getUsers(), getSessions()]中引用的示例基本相同 - 区别在于您的函数是匿名的,并使用map隐式调用,而不是通过名称显式调用。通过这种方式,您可以更灵活地调用函数。

答案 1 :(得分:0)

基本上,在最简单的情况下,使用匿名功能作为包装器,您需要先调用它,然后再将其放入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”,以防出现“大匿名函数主体”。