【问题标题】:Node.js Generator "already running" when throwing errors to itself向自身抛出错误时,Node.js 生成器“已经在运行”
【发布时间】:2017-06-04 19:41:00
【问题描述】:

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

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 在exec 返回错误时)而不是显示My error message,它显示Uncaught TypeError: Generator is already running。快乐案例(即当我打电话给gen.next(something) 时)可以正常工作。什么给了?

在触发快乐标志之前人们跳入:不,当我收到语法错误或其他不是gen.thrown 的错误时,例如在this question 中,行为是正确的 - 错误消息是适当的并且堆栈跟踪点到正确的地方。

【问题讨论】:

  • 看来,当我返回一个承诺并从承诺thencatch 调用gen.throw 时,一切正常。这只发生在通用回调中。

标签: javascript node.js sails.js mocha.js


【解决方案1】:

如果相信调试器,这似乎与多次触发错误的回调有关。解决方案是根本不使用这种模式,或者像这样将异步调用包装在 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 导致的问题远远超过它的价值。

【讨论】:

    猜你喜欢
    • 2022-10-30
    • 2021-07-16
    • 1970-01-01
    • 2016-06-14
    • 2022-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2020-03-14
    相关资源
    最近更新 更多