我在代码中使用以下模式:
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中一样,行为是正确的 - 错误信息是合适的并将跟踪点堆叠到正确的位置。
答案 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会导致更多问题而不是它的价值。