2016-11-28 2 views
3

ich eine Funktionskette in einem node 4.3 Skript, das so etwas wie, Rückruf sieht -> Versprechen -> async/await -> async/await -> async/awaitFangen Fehler von verschachtelten async/erwarten Funktionen

wie so :

const topLevel = (resolve, reject) => { 
    const foo = doThing(data) 
    .then(results => { 
     resolve(results) 
    }) 
    .catch(err => { 
     reject(err) 
    }) 
} 

async function doThing(data) { 
    const thing = await doAnotherThing(data) 
    return thing 
} 

async function doAnotherThing(data) { 
    const thingDone = await etcFunction(data) 
    return thingDone 
} 

(der Grund ist es nicht async/await den ganzen Weg durch ist, dass die Top-Level-Funktion eine Task-Queue-Bibliothek ist, und kann angeblich nicht async/await Stil ausgeführt werden)

Wenn etcFunction() wirft, macht das error Blase den ganzen Weg bis zur obersten Ebene Promise?

Wenn nicht, wie kann ich aufblasen errors? Muss ich jeden await in einem try/catch und throw von dort wie so wickeln?

async function doAnotherThing(data) { 
    try { 
    await etcFunction(data) 
    } catch(err) { 
    throw err 
    } 
} 
+0

Was ist 'makePromise'? – Bergi

+0

"* Die Top-Level-Funktion ist eine Task-Queue-Bibliothek, und angeblich kann async/await style * nicht ausgeführt werden" - es gibt keinen Grund, warum eine Queue-Bibliothek Async-Funktionen nicht als Tasks verwenden kann. Sie sollten wirklich nicht mit Rückrufen umgehen müssen. Verwenden Sie eine Wrapperfunktion, wenn Sie eine bestimmte Warteschlangenbibliothek verwenden müssen, die den Rückrufstil verwendet. – Bergi

+0

@Bergi 'makePromise' ist eigentlich eine 'async'-Funktion, aber da es aus einer Nicht-Async-Umgebung aufgerufen wird, handle ich es wie ein Versprechen. Re: Ich stimme zu, ich werde versuchen und versprechen-ify es schließlich, aber kann ich zuverlässige Fehler in der Zwischenzeit sprudeln? – Brandon

Antwort

2

Wenn etcFunction() wirft, wird die Fehler sprudeln die ganzen Weg durch die async function s?

Ja. Die von der äußersten Funktion zurückgegebene Zusage wird zurückgewiesen. Es gibt keine Notwendigkeit, try { … } catch(e) { throw e; } zu tun, das ist genauso sinnlos wie es in synchronem Code wäre.

... bis zum Top-Level Promise?

Nein. Ihre topLevel enthält mehrere Fehler. Wenn Sie nicht return der doThing(data) von then Rückruf, wird es ignoriert (nicht einmal erwartet) und die Ablehnung bleibt unbehandelt. Sie werden

.then(data => { return doThing(data); }) 
// or 
.then(data => doThing(data)) 
// or just 
.then(doThing) // recommended 

Und im Allgemeinen verwenden, Ihre Funktion sollte wie folgt aussehen:

function toplevel(onsuccess, onerror) { 
    makePromise() 
    .then(doThing) 
    .then(onsuccess, onerror); 
} 

Keine unnötige Funktion Ausdrücke, keine .then(…).catch(…) antipattern (das zu onsuccess und onerror-führen könnte beide heißen).