Ember.RSVP中的条件承诺

时间:2016-01-07 19:48:52

标签: javascript ember.js rsvp.js rsvp-promise

我有一个简单的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));

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

3 个答案:

答案 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))那样调用它。这样就传递了函数的结果,而不是函数。