`co`异常导致Node Promise`deject()`抛出Jetbrains调试器

时间:2016-06-25 00:51:33

标签: node.js promise v8 es6-promise jetbrains-ide

我在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未被捕获的异常,调用堆栈真的很模糊:

Broken promise

使用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))的区别?有些事情可能导致它在某些情况下行为不端(不只是在调试器中而是在生产中)?

0 个答案:

没有答案