基于另一个承诺解决承诺
Resolve promise based on another promise
我有一个函数,它返回一个promise,在里面我调用另一个函数。这个promise的状态基于内部promise的状况。
有没有一种方法可以简化这个过程。看看下面的例子。
function foo(bar) {
var deferred = Q.defer();
switch (bar) {
case 'baz1':
deferred.resolve();
break;
case 'baz2':
deferred.reject();
break;
case 'this_is_how_i_do_it':
funReturningPromise().then(function (value) {
deferred.resolve(value);
}, function (err) {
deferred.reject(err);
});
break;
case 'can_we_do_it_like_this':
// can we do something like this, which will resolve or reject the deferred,
// based on the status promise returned by funReturningPromise().
// 'chain' is just a name
funReturningPromise().chain(deferred);
break;
}
return deferred;
}
谢谢,
它不适用于更复杂的函数,但在您的示例中,您可以执行以下操作:
case 'can_we_do_it_like_this':
return funReturningPromise();
如果只使用q promise,也可以尝试添加自己的promise.prototype.chain
方法。
如果从Q管理的任何函数内部返回值、抛出异常或返回promise,特别是给then
的回调,则链式promise将"变成"该值、异常或promise。
var foo = Q.fbind(function (bar) {
switch (bar) {
case 'baz1':
return;
case 'baz2':
throw new Error("");
case 'this_is_how_you_can_do_it':
return funReturningPromise();
}
});
在这种情况下,我使用Q.fbind
来保证返回结果是promise,但如果在promise处理程序的上下文中调用foo
,就像funReturningPromise
一样,那么fbind
将是不必要的。如果您想立即调用一个函数并获得结果的promise,也可以使用fcall
。
如果您已经延迟了,那么您可以用另一个promise来解决它。
deferred.resolve(funReturningPromise())
否则,就是克里斯说的。
相关文章:
- 简单的ES6承诺问题-交换解决和拒绝参数
- RxJS等待承诺解决
- 如何在解决承诺之前和之后验证值
- AngularJS-我怎么知道何时解决了对父控制器的承诺
- 在我的案例中,如何解决我的承诺问题
- 所有承诺解决后返回
- $.当承诺解决得太早时
- 如果你用另一个承诺解决一个承诺会发生什么
- 基于另一个承诺解决承诺
- 承诺解决不了问题
- 如何知道什么时候所有的承诺都被拒绝了,或者用基本的js承诺解决了
- Ember RSVP承诺解决firefox插件端口消息传递方案无法解决的模型
- 客户端等待服务器承诺解决
- while(true)循环中的承诺/等待承诺解决
- 推迟承诺解决
- 用承诺解决jQuery延迟
- 等待多个单独的承诺解决
- EmberJS - 在承诺解决后调用超级操作
- 如何为另一个承诺解决一个承诺
- 为什么我的承诺散列在传递的承诺解决之前就解决了?