Разрешить обещание, основанное на другом обещании

У меня есть функция, которая возвращает обещание, внутри которого я вызываю другую функцию, и статус этого обещания основан на состоянии внутреннего обещания.

Есть ли способ сокращения этого процесса. Посмотрите на пример ниже.

    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())

Иначе, что сказал Крис.

Другие вопросы по тегам