Wciąż uczę się JavaScript Promise
s, i natknąłem się na zachowanie, którego nie rozumiem.Obietnica JavaScript wtedy() zamawianie
var o = $("#output");
var w = function(s) {
o.append(s + "<br />");
}
var p = Promise.resolve().then(function() {
w(0);
}).then(function() {
w(1);
});
p.then(function() {
w(2);
return new Promise(function(r) {
w(3);
r();
}).then(function() {
w(4);
});
}).then(function() {
w(5);
});
p.then(function() {
w(6);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="output"></div>
spodziewałbym te oświadczenia, aby uruchomić w porządku - to znaczy, że wynik byłby
0
1
2
3
4
5
6
Zamiast tego, wyjście jest
0
1
2
3
6
4
5
Nawet usunięcie wewnętrznego podajnika Promise
s, co wydaje mi się być, sprzeczne wyniki. 1
jest wyprowadzane przed 2
, ale 6
jest wyprowadzane przed 5
.
Czy ktoś może mi to wyjaśnić?
Coś, co zauważyłem, to ponowne przydzielanie numeru p
za każdym razem, gdy otrzymujemy zamówienie, którego oczekuję.
Dlaczego oczekujesz tego zamówienia? Kolejność, w jakiej piszesz kod, niekoniecznie jest kolejnością, w której obietnice rozwiązują się; tylko "wtedy" ma nad tym kontrolę. – elclanrs
Ponieważ oczekuję, że 'then()' zdarzy się w porządku. – dfoverdx
Tak, "następnie" ** każdego ** łańcucha obietnic. – elclanrs