有条件地执行Promise.all()中的承诺



我有两个承诺,输入两个不同的参数:

promise1(var1)
promise2(var2)

这些承诺在promise中并行运行。all():

Promise.all([promise1(var1), promise2(var2)])

有时,根据var1或var2的值,我只需要执行其中一个。例如,如果var1为空,我只需要

Promise.all([promise2(var2)])

或者,如果var2为null:

Promise.all([promise1(var1)])

有没有一个优雅的方法来编码这种情况没有if, else分支?

Promise.all([
var1 ? promise1(var1) : Promise.resolve(null),
var2 ? promise2(var2) : Promise.resolve(null),
]);

为什么你认为if .. else不够优雅?在许多情况下,它是最易读的代码,因此我认为它比一些"构造良好"的代码要好。你下次再读它的时候,你就再也看不懂了。

我个人会创建一个数组,并根据条件将各种承诺放入该数组。最后用这个数组做一个Promise.all。在我看来,这是最有可读性和最优雅的方式。

let promises = [];  
if (val1) promises.push(promise1(val1));
if (val2) promises.push(promise1(val2));
Promise.all(promises);

可以通过动态创建承诺来实现。所有数组参数

var promises=[];
if(var1==null)
promise.push(promise2(var2));
if(var2==null)
promise.push(promise1(var1));
Promise.all(promises);

我不会去解决有时你传递一个数组与2承诺Promise.all,和有时只有1。如果您需要从Promise.all返回的内容中获得已解析的值,那么您将很难确定值来自何处。所以不要玩弄数组的大小。保持预定。

更好的解决方案是调整promise1promise2函数,以便当它们获得的参数是null(或任何您想以不同的方式对待)时,它们返回nullundefined。然后像在初始代码中那样调用Promise.all:

Promise.all([promise1(var1), promise2(var2)])

如果您不想修改promise1promise2函数,那么执行:

Promise.all([(var1 !== null) && promise1(var1),
(var2 !== null) && promise1(var2)]);

注意,当数组中有一个非承诺值时,没有问题。这将被视为立即解决的承诺。

最新更新