Javascript 基于另一个承诺解决承诺
我有一个函数,它返回一个承诺,我调用另一个函数,这个承诺的状态基于内部承诺的状态 有没有办法简化这个过程。看看下面的例子Javascript 基于另一个承诺解决承诺,javascript,node.js,q,Javascript,Node.js,Q,我有一个函数,它返回一个承诺,我调用另一个函数,这个承诺的状态基于内部承诺的状态 有没有办法简化这个过程。看看下面的例子 function foo(bar) { var deferred = Q.defer(); switch (bar) { case 'baz1': deferred.resolve(); break; case 'baz2'
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 promises,您也可以尝试添加自己的
promise.prototype.chain
方法。对于更复杂的函数,它不起作用,但在您的示例中,您可以执行以下操作:
case 'can_we_do_it_like_this':
return funReturningPromise();
如果您只使用q promises,您还可以尝试添加自己的
promise.prototype.chain
方法。如果您从q管理的任何函数内部返回值、抛出异常或返回承诺,特别是对的回调,那么,链接的承诺将“变成”该值、异常,或者承诺
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();
}
});
deferred.resolve(funReturningPromise())
在本例中,我使用Q.fbind
来保证返回结果是一个承诺,但是如果在承诺处理程序的上下文中调用foo
,就像funReturningPromise
,那么fbind
就没有必要了。如果要立即调用函数并获得结果的承诺,也可以使用fcall
如果返回值、引发异常或从Q管理的任何函数内部返回承诺,特别是对的回调,则链接承诺将“变为”该值、异常,或者承诺
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();
}
});
deferred.resolve(funReturningPromise())
在本例中,我使用Q.fbind
来保证返回结果是一个承诺,但是如果在承诺处理程序的上下文中调用foo
,就像funReturningPromise
,那么fbind
就没有必要了。如果要立即调用函数并获得结果的承诺,也可以使用fcall
如果已经有了延迟,则可以使用另一个承诺来解决它
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();
}
});
deferred.resolve(funReturningPromise())
否则,就像克里斯说的那样。如果你已经有了延期付款,那么你可以用另一个承诺来解决它
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();
}
});
deferred.resolve(funReturningPromise())
否则,克里斯说了什么