Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于另一个承诺解决承诺_Javascript_Node.js_Q - Fatal编程技术网

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())
否则,克里斯说了什么