Verstehen der Ausführungsreihenfolge in JavaScript-Versprechen
Versprechen in JavaScript bieten ein asynchrones Programmiermodell, bei dem Code ausgeführt wird, sobald ein bestimmtes Ereignis oder Versprechen eintrifft , ist erfüllt. Beim Umgang mit mehreren Versprechen ist es jedoch wichtig, die Ausführungsreihenfolge zu verstehen, um unvorhersehbares Verhalten zu vermeiden.
Bedenken Sie den folgenden Codeausschnitt:
Promise.resolve('A') .then(function(a){console.log(2, a); return 'B';}) .then(function(a){ Promise.resolve('C') .then(function(a){console.log(7, a);}) .then(function(a){console.log(8, a);}); console.log(3, a); return a;}) .then(function(a){ Promise.resolve('D') .then(function(a){console.log(9, a);}) .then(function(a){console.log(10, a);}); console.log(4, a);}) .then(function(a){ console.log(5, a);}); console.log(1); setTimeout(function(){console.log(6)},0);
Bei der Ausführung können Sie die folgende Ausgabereihenfolge beobachten:
1 2 "A" 3 "B" 7 "C" 4 "B" 8 undefined 9 "D" 5 undefined 10 undefined 6
Die Ausführungsreihenfolge verstehen
Recommendations
Um eine bestimmte Ausführungsreihenfolge sicherzustellen, vermeiden Sie die Erstellung unsynchronisierter Versprechensketten und verlassen Sie sich stattdessen auf die sequentielle Verknüpfung von Versprechen. Geben Sie Versprechen von inneren .then()-Handlern zurück, um sie mit dem übergeordneten Versprechen zu verketten, wie unten gezeigt:
Promise.resolve('A').then(function (a) { console.log(2, a); return 'B'; }).then(function (a) { var p = Promise.resolve('C').then(function (a) { console.log(7, a); }).then(function (a) { console.log(8, a); }); console.log(3, a); return p; // Link the inner promise to the parent chain }).then(function (a) { var p = Promise.resolve('D').then(function (a) { console.log(9, a); }).then(function (a) { console.log(10, a); }); console.log(4, a); return p; // Link the inner promise to the parent chain }).then(function (a) { console.log(5, a); }); console.log(1); setTimeout(function () { console.log(6) }, 0);
Mit diesem Ansatz wird die Ausführungsreihenfolge vollständig deterministisch: 1, 2 „A“, 3 „B“, 7 „C“, 8 undefiniert, 4 undefiniert, 9 „D“, 10 undefiniert, 5 undefiniert und 6.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3