在promisified ExpressJs函数中引发错误

时间:2015-02-06 17:38:13

标签: javascript node.js express bluebird

我不太清楚我是否理解承诺中的错误是如何处理的(我对承诺很新,所以我可能不会充分利用它们。)

我有以下代码:

app.listenAsync = Promise.promisify(app.listen);

app.listenAsync(config.port)
.then(function done() {
    console.log("We're listening!");
})
.catch(function (err) {
    console.log("Abort abort!");
});

由于我不太了解的原因,即使app.listenAsync抛出错误,例如EADDRINUSE,我的catch()也永远不会被调用。为什么呢?

修改: 我刚注意到,如果我做了

var listenAsync = Promise.promisify(app.listen);

listenAsync(config.port)
    .then(function done() {
        console.log("We're listening!");
    })
    .catch(function (err) {
        console.log("Abort abort!");
    });

提供几乎正确的行为。 listenAsync抛出一个错误(这次在catch语句中捕获)Possibly unhandled TypeError: listener must be a function。我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

这与promises无关,它只是基本的javascript:你正在调用listen就好像它是一个函数,但它是app的方法。

一些选项:

Promise.promisifyAll(app);
// Note how it's called as a method on app
app.listenAsync(...).then(....)

或者

// Bind the function as a method of app
var appListenAsync = Promise.promisify(app.listen, app);
appListenAsync(...).then(....)