我在Node 6.x中运行相当复杂的代码,我无法在简单的条件下复制问题。应用程序相关部分的要点是
<div style="text-align:center">
// app.js
someCoWrapper(function*() {
yield hapiServerStart();
// unreachable
...
})
.catch(console.error);
// some-co-wrapper.js
function someCoWrapper(genFn) {
return co(genFn).then(
(result) => new Promise((resolve) => resolve(result)),
(error) => {
return new Promise((resolve, reject) => {
return reject(error)
})
}
)
}
// some-callback-called-inside-serverStart.js
...
assert(..., 'I was thrown from server init callback');
...
的包装器可以在promise实现之间切换,它本来是透明的(它失败了)。
我希望co
承诺从生成器捕获异常并将其记录到co
。这与console.error
的预期一致。在Jetbrains(PhpStorm 2016)中,它适用于 Run 。但是它会导致node debug app.js
未被捕获的异常,调用堆栈真的很模糊:
使用Debug
(自然)保护yield hapiServerStart();
时不会出现此问题。
更改try...catch
实施有助于两者
Promise
和
global.Promise = require('es6-promise').Promise;
的工作。最有趣的是将上面的代码更改为
global.Promise = require('bluebird');
也有帮助!
那里有太多的活动部件,并且它出现在Jetbrains产品中的事实表明它可能有些可疑。
如果有任何意见可以说明这里发生的事情,我将不胜感激。
真正的问题是return co(genFn)
.then(
(result) => Promise.resolve(result)),
(error) => Promise.reject(error))
);
与Node {V8实现中new Promise((err) => reject(err))
的区别?有些事情可能导致它在某些情况下行为不端(不只是在调试器中而是在生产中)?