promisified ExpressJs函数中的抛出错误

问题描述:

我不太确定我理解错误是如何在promise中处理的(而且我对承诺相当陌生,所以我可能不会使用它们来充分发挥它们的潜力)。promisified ExpressJs函数中的抛出错误

我有以下代码:

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!"); 
}); 

对于原因,我不太明白,我catch()不会被调用,即使app.listenAsync抛出一个错误,EADDRINUSE例如。为什么?

编辑: 我只注意到,如果我做

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。我错过了什么吗?

+0

您是否尝试过使用'Promise'对象USAL,像 '新的承诺(函数(reslve,拒绝){ 尝试{应用。 listen(config.port); resolve();} catch(){reject();} })。然后(...)。catch(...)'? – 2015-02-06 17:43:59

+0

请给出完整的代码,以防万一您使用的是蓝鸟版本吗? – Esailija 2015-02-10 00:34:35

+0

蓝鸟2.9.9 完整代码:http://pastie.org/9960184 我对此延误表示歉意。 – Nepoxx 2015-02-18 19:03:44

这与承诺没有任何关系,它只是基本的javascript:你打电话来听,就好像它是一个函数,但它是一种方法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(....)