2017-11-27 3 views
0

Wir haben in unserem Code einen Task Runner. Wir rufen einige IDs ab, um die Aufgabe von einer entfernten Quelle aus auszuführen, so dass wir beim Schreiben des Codes nicht wissen können, wie viele Aufgaben wir parallel ausführen werden.Parallele Aufgaben mit Fehlerbehandlung und keine Fehler-schnelle

wichtig für uns, müssen wir richtigen Fehler für jede Aufgabe zeigt im Endergebnis Handling (so, wenn ein Fehler in einem der Aufgabenausführung auftritt, können wir eine weitere Bereinigung Aktion auslösen). Auch wollen wir nicht Fail-Fast-Verhalten: Wenn irgendwelche Aufgaben fehlschlagen, wollen wir nicht, dass andere Aufgaben fehlschlagen. Wie gesagt, wir werden das separat behandeln.

Hier ist unser Code:

function doTask(param){ 
    return new Promise((resolve, reject) => { 
    setTimeout(()=>{ 
     if(param ===2) 
     reject('failed ' + param); 
     resolve('done ' + param) 
    }, 1000 - param) 
    }) 
} 

let ids = [1,2,3]; // This array of ID is retrieved from remote source 
let tasks = ids.map(doTask); 
const startTime = performance.now(); 

console.log(`Tasks starting...`); 
Promise.all(tasks.map(p => p.catch(e => e))) 
    .then(results => console.log(`Task finished in ${ performance.now() - startTime } miliseconds with,`, results)) 
    .catch(e => console.log('should not happen but we never know', e)); 

https://jsfiddle.net/bjev4u5o/1/

Es funktioniert, aber meine Neugier führt mich zu fragen, ob es eine bessere Möglichkeit ist, dass zu schreiben. Und vor allem vielleicht die async/await Techniken könnten uns helfen?

+0

Die '.catch (e => e)' nicht so aussieht die „* richtige Fehlerbehandlung *“ Sie wurden zu sprechen :-) – Bergi

+0

Ja, das ist genau das, wie dies geschehen ist. 'async' /' await'-Syntax kann als Zucker anstelle von 'then'-Aufrufen fungieren, führt jedoch nicht zu einem neuen Lösungsansatz. – Bergi

+0

@Bergi Tatsächlich ist die Fehlerbehandlung möglicherweise nicht die effizienteste. Was sind deine Empfehlungen dazu? Ich möchte nur den Fehler im Ergebnis-Array zusammen mit der fehlerhaften ID schieben. Beispiel: '{id: x, res: '', err: der Fehler}' – BlackHoleGalaxy

Antwort

2

Dies wäre eine async/await-Version (Ich schrieb es in Typoskript, sollte aber in JS minus der Typ-Annotation auf wrapTask gleich sein). Wetter gibt es keine Verbesserung gegenüber der klassischen Version ist in diesem Fall diskutabel.

function doTask(param) { 
    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
      if (param === 2) reject('failed ' + param); 
      resolve('done ' + param) 
     }, 1000 - param) 
    }) 
} 

async function doAll() { 
    async function wrapTask(promise: Promise<any>) { 
     try { 
      return await promise; 
     } catch (e) { 
      return e; 
     } 
    } 
    let ids = [1, 2, 3]; // This array of ID is retrieved from remote source 
    let tasks = ids 
     .map(doTask); 

    const startTime = performance.now(); 

    console.log(`Tasks starting...`); 
    try { 
     let results = await Promise.all(tasks.map(wrapTask)); 
     console.log(`Task finished in ${performance.now() - startTime} miliseconds with,`, results) 
    } catch (e) { 
     console.log('should not happen but we never know', e) 
    } 
} 

doAll();