2017-06-04 3 views
0

wirft ich das folgende Muster verwenden in meinem Code:Node.js Generator „bereits ausgeführt“, wenn Fehler selbst

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(); 

Wo setTimeout einig Asynchron-Funktion (zum Beispiel Datenbank holen oder etwas). Dies funktioniert innerhalb des Browsers, aber wenn ich es innerhalb eines Mocha-Integrationstests für meine Sailsjs-App von node.js v 7.9.0 starte, anstatt My error message anzuzeigen, wenn der Fehler auftritt (zB wenn Sails einen Fehler auf exec zurückgibt), Es wird Uncaught TypeError: Generator is already running angezeigt. Happy Case (d. H. Wenn ich gen.next(something) anrufen) funktioniert ohne Probleme. Was gibt?

Und vor schießfreudigen Flagge Menschen springen in: nein, wenn ich Syntaxfehler oder andere Fehler auftreten, die nicht gen.throw n sind, wie in this question, das Verhalten ist korrekt - Fehlermeldung ist angemessen und Stack-Trace zeigt nach rechts Ort.

+0

Es scheint, dass, wenn ich ein Versprechen zurückgebe und 'gen.Twurk' aus dem Versprechen' then' oder 'catch' nenne, alles gut geht. Dies geschieht nur in generischen Callbacks. – Megakoresh

Antwort

0

Dies scheint mit dem Rückruf im Zusammenhang zu stehen, der bei Fehlern mehrfach ausgelöst wird, wenn man an den Debugger glaubt. Die Lösung ist entweder nicht dieses Muster überhaupt zu verwenden, oder von dem Asynchron-Aufruf in einem Versprechen wickeln wie so

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)); 

hässlich, ist es nicht? Ich entschied mich für einen Co-like-automatischen Generator Runner und Async-Funktionen, wo ich konnte. Um die App von Sails nach Koa zu migrieren, verursacht Waterline viel mehr Probleme als es wert ist.

Verwandte Themen