[英]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.