【问题标题】:Conditional promises in Ember.RSVPEmber.RSVP 中的条件承诺
【发布时间】:2016-04-12 08:37:27
【问题描述】:

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

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

【问题讨论】:

  • 你应该接受其中一个答案,或者至少解释为什么你没有接受任何一个答案。

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


【解决方案1】:

这样的事情怎么样:

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

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

【讨论】:

    【解决方案2】:

    尝试移动到Ember.RSVP.Promise 并在你的函数中返回承诺(它应该将它们链接起来):

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

    【讨论】:

      【解决方案3】:

      这样做的一种优雅方式:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-06
        • 2015-06-22
        • 2018-02-25
        • 2021-08-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        相关资源
        最近更新 更多