0

我有一个函数,它返回一个 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;
    }

谢谢,

4

3 回答 3

2

它不适用于更复杂的功能,但在您的示例中,您可以执行以下操作:

        case 'can_we_do_it_like_this':
            return funReturningPromise();

promise.prototype.chain如果您只使用 q 承诺,您也可以尝试添加自己的方法。

于 2013-08-14T09:40:59.703 回答
1

如果您从 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用来保证返回结果是一个承诺,但如果foo在承诺处理程序的上下文中调用,就像funReturningPromise,那fbind将是不必要的。如果你想立即调用一个函数并得到一个结果的承诺,你也可以使用fcall.

于 2013-08-27T15:27:00.800 回答
0

如果你已经有了 deferred,那么你可以用另一个 Promise 来解决它。

deferred.resolve(funReturningPromise())

否则,Kris 所说的。

于 2015-01-14T02:05:19.663 回答