2017-06-04 29 views
0

我用我的代码如下模式:Node.js的发电机“已经运行”引发错误的时候将自己

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一些异步函数(例如数据库中读取或东西)。 这适用于浏览器内部,但是当我从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

看来,当我返回一个承诺,并从承诺'然后'或'catch'调用'gen.throw'时,一切正常。这只发生在通用回调中。 – Megakoresh

回答

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会导致更多的问题,而不是它的价值。