向自己抛出错误时,Node.js生成器“已经在运行”

时间:2017-06-04 19:41:01

标签: javascript node.js sails.js mocha

我在代码中使用以下模式:

let gen = (function*(){
    let foo = yield setTimout((err, something)=> err ? gen.throw(err) : gen.next(something), 1000, new Error('My error message'), null);
    console.log(foo);
})();
gen.next();

其中setTimeout是一些异步函数(例如数据库提取或其他东西)。 这适用于浏览器,但是当我在mocha集成测试中运行它时 对于来自node.js v 7.9.0的我的Sailsjs应用程序,而不是显示My error message,当错误发生时(例如当Sails在exec上返回错误时),它显示Uncaught TypeError: Generator is already running。快乐的情况(即当我呼叫gen.next(something)时)工作没有问题。是什么给了什么?

在触发快乐标志之前,人们会跳进去:不,当我收到语法错误或其他错误不是gen.throw n时,就像在this question中一样,行为是正确的 - 错误信息是合适的并将跟踪点堆叠到正确的位置。

1 个答案:

答案 0 :(得分:0)

如果相信调试器,这似乎与错误多次触发回调有关。解决方案要么根本不使用此模式,要么将异步调用包含在Promise中,如此

let foo = yield new Promise((res, rej)=>setTimout((err, something)=> err ?
 rej(err) : 
 res(something),
 1000, 
 new Error('My error message'), 
 null))
   .then(something=>gen.next(something)
   .catch(err=>gen.throw(err));
丑陋,不是吗?我选择了一个像自动发电机一样的自动发电机转子,并尽可能地执行异步功能。无论如何,要将应用程序从Sails迁移到Koa,Waterline会导致更多问题而不是它的价值。