节点承诺链有错误但仍然执行。那么,为什么?

时间:2016-06-11 17:13:57

标签: javascript node.js promise bluebird

为什么当promise链有错误时它不会执行。除非.then引用带参数的外部方法?

所以这个例子我故意在promise链中抛出一个错误。前三个。然后没有像预期的那样开火。但是,最后一个带有参数的方法会触发。为什么?然后.catch正如预期的那样发射。

    var Promise = require('bluebird');
    var testVar = 'foo';

    errorOnPurpose()
        .then(function() {
            console.log('This will not fire, as expected');
        })
        .then(function(testVar) {
            console.log('This also will not fire, as expected');
        })
        .then(testMethod1)
        .then(testMethod2(testVar))
        .catch(function(error) {
            console.log('Error:::', error, ' , as expected');
        });

    function errorOnPurpose() {
        return new Promise(function(resolve, reject) {
            return reject('This promise returns a rejection');
        });
    }

    function testMethod1() {
        console.log('This one will not fire either, as expected');
    }

    function testMethod2(foo) {
        console.log('This will fire!!!!, ARE YOU KIDDING ME!! WHY??');
    }

控制台中的结果:

    This will fire!!!!, ARE YOU KIDDING ME!! WHY??
    Error::: This promise returns a rejection  , as expected

2 个答案:

答案 0 :(得分:2)

.then(testMethod2(testVar))在这个方法中你没有传递testMethod2函数,你传递它的响应(因为在Javascript中你通过编写funcName(funcParam)来调用函数)

用一些参数传递函数你必须像这样调用它: .then(testMethod2.bind(this, testVar))

Function.prototype.bind

答案 1 :(得分:1)

这与承诺无关。

您正在立即调用该方法:testMethod2(testVar)

然后,您将该方法调用的返回值传递给then