繁体   English   中英

Ember中的条件承诺

[英]Conditional promises in Ember.RSVP

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

但这不起作用。 似乎promise 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));

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

这样的事情怎么样:

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

它将尝试数组中的每个项目,但如果标志为false,则跳过第一个项目。 如果您希望doSomething()失败,则跳过doNextThing(),请使用Em.RSVP.all()。

尝试移至Ember.RSVP.Promise并在函数中返回promise(它应将它们链接起来):

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

return somePromise.then(doNextThing);

一种优雅的方法:

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

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

这是因为该函数then一个函数作为其参数,因此不能像firstThing.then(doNextThing(param))这样调用它。 这样,您将传递函数的结果,而不是函数的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM