基于另一个承诺解决承诺

Resolve promise based on another promise

本文关键字:承诺 解决 一个承诺 于另      更新时间:2023-09-26

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

否则,就是克里斯说的。