0

我有一个简单的 if else 场景,如果设置了变量,我需要做一些事情,否则只需在 else 部分执行:

if(flag) {
  doSomething();
}
doNextThing(someParam);

如果设置了标志,那么我必须 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));

但除了第一个选项外,没有任何效果。所以,我的问题是 - 有没有更好/优雅的方法来实现这一目标?

4

3 回答 3

1

像这样的东西怎么样:

Em.RSVP.allSettled([
    !flag || doSomething(),
    doNextThing()
])

它将尝试数组中的每一项,但如果标志为假,则跳过第一项。如果您希望它在 doSomething() 失败时跳过 doNextThing(),则使用 E​​m.RSVP.all()。

于 2016-01-07T22:13:59.820 回答
0

尝试在你的函数中移动Ember.RSVP.Promise并返回 promise(它应该链接它们):

var somePromise = new Ember.RSVP.Promise(function (resolve, reject) {
     if (flag) {
         return doSomething;
     }
     resolve();
});

return somePromise.then(doNextThing);
于 2016-01-07T20:03:40.353 回答
0

这样做的一种优雅方式:

var firstThing = flag ? doSomething() : Ember.RSVP.resolve();
firstThing.then(doNextThing.bind(null, someParam));

如果您查看then函数,我正在使用绑定函数来创建部分应用的函数。

这是因为函数then需要一个函数作为他的参数,所以你不能这样调用它firstThing.then(doNextThing(param))。这样,您传递的是函数的结果,而不是函数。

于 2016-01-07T20:05:24.460 回答