Разрешить обещание, основанное на другом обещании
У меня есть функция, которая возвращает обещание, внутри которого я вызываю другую функцию, и статус этого обещания основан на состоянии внутреннего обещания.
Есть ли способ сокращения этого процесса. Посмотрите на пример ниже.
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;
}
Спасибо,
3 ответа
Это не работает так же для более сложных функций, но в вашем примере вы можете сделать что-то вроде:
case 'can_we_do_it_like_this':
return funReturningPromise();
Вы также можете попробовать добавить свой собственный promise.prototype.chain
метод, если вы используете только д обещания.
Если вы возвращаете значение, генерируете исключение или возвращаете обещание внутри любой функции, управляемой Q, в частности, обратных вызовов, данных для then
связанное обещание "станет" тем значением, исключением или обещанием.
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
чтобы гарантировать, что возвращаемый результат является обещанием, но если foo
были вызваны в контексте обработчика обещаний, так же, как funReturningPromise
, fbind
было бы ненужным. Если вы хотите немедленно вызвать функцию и получить обещание результата, вы также можете использовать fcall
,
Если у вас уже есть отсроченный, то вы можете решить его с другим обещанием.
deferred.resolve(funReturningPromise())
Иначе, что сказал Крис.