2017-06-04 52 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會導致更多的問題,而不是它的價值。