Node.js 生成器 "already running" 向自身抛出错误时
Node.js Generator "already running" when throwing errors to itself
我在我的代码中使用了以下模式:
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 应用程序,当发生错误时(例如,当 Sails returns 在 exec
上出现错误时),它不会显示 My error message
,而是显示Uncaught TypeError: Generator is already running
。快乐案例(即当我调用 gen.next(something)
时)没有问题。给出了什么?
并且在 trigger-happy flag 之前人们跳入:不,当我遇到语法错误或其他不是 gen.throw
n 的错误时,如 this question,行为是正确的 - 错误消息是合适的,堆栈跟踪指向正确的位置。
如果相信调试器,这似乎与回调多次触发错误有关。解决方案要么根本不使用这种模式,要么像这样将异步调用包装在 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 导致的问题比它的价值多得多。
我在我的代码中使用了以下模式:
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 应用程序,当发生错误时(例如,当 Sails returns 在 exec
上出现错误时),它不会显示 My error message
,而是显示Uncaught TypeError: Generator is already running
。快乐案例(即当我调用 gen.next(something)
时)没有问题。给出了什么?
并且在 trigger-happy flag 之前人们跳入:不,当我遇到语法错误或其他不是 gen.throw
n 的错误时,如 this question,行为是正确的 - 错误消息是合适的,堆栈跟踪指向正确的位置。
如果相信调试器,这似乎与回调多次触发错误有关。解决方案要么根本不使用这种模式,要么像这样将异步调用包装在 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 导致的问题比它的价值多得多。