我有一个简单的if else方案,如果设置了变量,我需要做一些事情,否则只需在else部分执行:
if(flag) {
doSomething();
}
doNextThing(someParam);
如果设置了flag,那么我必须doSomething()和doNextThing()
doSomething和doNextThing都会返回承诺。实现这个的最佳方法是什么?
目前我的代码如下:
if(flag) {
doSomething().then(doNextThing);
}
else doNextThing(someParam);
在清洁代码段中优雅地将两者结合起来的最佳方法是什么?
我试过了:
var somePromise = new Promise(function(resolve, reject){
if(flag)
doSomething.then(resolve(result));
else resolve();
})
return somePromise.then(doNextThing(resolvedValue))
但这不起作用。似乎承诺doSomething永远不会解决,代码立即返回。我还尝试了以上几种变体,包括:
var somePromise = new Promise(function(resolve, reject){
if(flag)
doSomething.then(resolve);
else resolve();
})
和
var somePromise = new Promise(function(resolve, reject){
if(flag)
doSomething.then(function(result){
resolve(result);
}.bind(this));
else resolve();
}.bind(this));
但没有任何作用,除了第一个选项。所以,我的问题是 - 是否有更好/更优雅的方法来实现这一目标?
答案 0 :(得分:1)
这样的事情怎么样:
Em.RSVP.allSettled([
!flag || doSomething(),
doNextThing()
])
它将尝试数组中的每个项目,但如果标志为false则跳过第一个项目。如果你想让它在doSomething()失败时跳过doNextThing(),那么使用Em.RSVP.all()。
答案 1 :(得分:0)
尝试移动到Ember.RSVP.Promise
并在函数中返回promise(它应链接它们):
var somePromise = new Ember.RSVP.Promise(function (resolve, reject) {
if (flag) {
return doSomething;
}
resolve();
});
return somePromise.then(doNextThing);
答案 2 :(得分:0)
这样做的一种优雅方式:
var firstThing = flag ? doSomething() : Ember.RSVP.resolve();
firstThing.then(doNextThing.bind(null, someParam));
如果查看then
函数,我将使用bind函数创建部分应用的函数。
这是因为函数then
期望一个函数作为他的参数,所以你不能像这个firstThing.then(doNextThing(param))
那样调用它。这样就传递了函数的结果,而不是函数。