我有两个承诺,输入两个不同的参数:
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
返回的内容中获得已解析的值,那么您将很难确定值来自何处。所以不要玩弄数组的大小。保持预定。
更好的解决方案是调整promise1
和promise2
函数,以便当它们获得的参数是null
(或任何您想以不同的方式对待)时,它们返回null
或undefined
。然后像在初始代码中那样调用Promise.all
:
Promise.all([promise1(var1), promise2(var2)])
如果您不想修改promise1
和promise2
函数,那么执行:
Promise.all([(var1 !== null) && promise1(var1),
(var2 !== null) && promise1(var2)]);
注意,当数组中有一个非承诺值时,没有问题。这将被视为立即解决的承诺。