2017-10-13 1 views
0

Ich bin etwas verwirrt über die Verwendung von Promise. Bitte beachten Sie die folgenden Beispiele:Wie kann ich die Ausnahme abfangen, wenn ich provect.all [] verwende oder den Kettenanruf stoppe

Q1. Wie kann ich den Kettenruf stoppen?

const wait = (duration = 0) => { 
 
    return new Promise((resolve) => { 
 
    setTimeout(resolve, duration); 
 
    }); 
 
}; 
 

 
const asyncTask1 =() => { 
 
    return wait(1000).then(() => { 
 
    console.log('task1 takes 1s.'); 
 
    }); 
 
}; 
 

 
const asyncTask2 =() => { 
 
    return wait(3000).then(() => { 
 
    console.log('task2 takes 3s.'); 
 
    }); 
 
}; 
 

 
Promise.resolve() 
 
    .then(() => { 
 
    asyncTask1(); 
 
    }) 
 
    .then(() => { 
 
    asyncTask2(); 
 
    }) 
 
    .catch(() => { 
 
    console.log('fail.'); 
 
    });

wie der Code zeigt asyncTask2 werden nicht ausgeführt, bis asyncTask1 abgeschlossen hat. Aber die Frage ist, wie kann ich den Kettenruf stoppen, wenn asyncTask1 fehlschlägt. Nämlich asyncTask2 wird nicht ausgeführt, weil die asyncTask1 fehlschlägt. Hinweis: Kein Fehler oder Ausnahme generiert in asyncTask1, ich möchte einen Status (Erfolg oder fehlgeschlagen) verwenden, um das Ergebnis von asyncTask1 zu entscheiden.

Q2. Wie kann ich feststellen, welche Task die Ausnahme generiert, wenn ich Promise.all() verwende?

const wait = (duration=0) => { 
 
    return new Promise((resolve) => { 
 
    setTimeout(resolve, duration); 
 
    }); 
 
}; 
 

 
const asyncTask1 =() => { 
 
    return wait(1000).then(() => { 
 
    console.log('task1 takes 1s.'); 
 
    }); 
 
}; 
 

 
const asyncTask2 =() => { 
 
    return wait(3000).then(() => { 
 
    console.log('task2 takes 3s.'); 
 
    }); 
 
}; 
 

 
Promise 
 
    .all([asyncTask2(), asyncTask1()]) 
 
    .then(() => { 
 
    console.log('all done.'); 
 
    }) 
 
    .catch((e) => { 
 
    console.log('error'); 
 
    });

Der obige Code erfolgreich ausgeführt werden kann, aber wenn asyncTask1 oder asyncTask2 ausfällt, wird es in die Auffangfunktion gehen. Die Frage ist also, wie kann ich wissen, ob die Ausnahme von asyncTask1 oder asyncTask2 ist?

+0

einfach einen einzigartigen Fehler für jeden Wurf und dann Sie kann den Fehler untersuchen, um zu sehen, um welchen Fehler es sich handelt. Abgesehen davon gibt es keine Möglichkeit zu wissen, wann 'Promise.all()' verwendet wird. Es meldet nur die erste Ablehnung ohne Bericht darüber, welche es war. – jfriend00

+0

Es mag Sie interessieren, zu wissen, dass die Executor-Funktion "new Promise" ** zwei ** Argumente benötigt ... 'new Promise ((auflösen, ablehnen) => ablehnen ('blah'))' wird das Versprechen eher zurückweisen als auflösen/erfülle es –

+0

"* Wie der Code zeigt, wird asyncTask2 nicht ausgeführt, bis asyncTask1 abgeschlossen ist. *" - Nein. Dazu müßte die Aufgabe 'return'ed von dem' then'-Callback sein, andernfalls wird sie in der Kette nicht erwartet. – Bergi

Antwort

0

können Sie Array.prototype.map() verwenden, um die Funktionen in einem Array auf nennen, throw die index des Elements, wo Fehler innerhalb .map() Rückruf erfolgt bei .catch()

const wait = (duration=0) => { 
 
    return new Promise((resolve) => { 
 
    setTimeout(resolve, duration); 
 
    }); 
 
}; 
 

 
const asyncTask1 =() => { 
 
    return wait(1000).then(() => { 
 
    console.log('task1 takes 1s.'); 
 
    }); 
 
}; 
 

 
const asyncTask2 =() => { 
 
    return wait(3000).then(() => { 
 
    throw new Error() 
 
    console.log('task2 takes 3s.'); 
 
    }); 
 
}; 
 

 
let arr = [asyncTask2, asyncTask1]; 
 

 
Promise 
 
    .all(arr.map((p, index) => 
 
    p().catch(err => {throw new Error(err + " at index " + index)}))) 
 
    .then(() => { 
 
    console.log('all done.'); 
 
    }) 
 
    .catch((e) => { 
 
    console.log('error', e); 
 
    });

Verwandte Themen