Wie Versprechen garantieren, dass die ‚Entschlossenheit‘ Funktion nach einer asynchronen Operation ausgeführt wird
Sie dies nicht tun. Versprechen sind nur ein Benachrichtigungs- und Fehlerfortpflanzungssystem. Sie lösen nur ein Versprechen, wenn ein Code resolve()
aufruft, um das Versprechen zu lösen. Sie sollten resolve()
nicht aufrufen, bis die asynchrone Operation tatsächlich ausgeführt wird. Wenn Sie resolve()
zu früh aufrufen (wie Sie es getan haben), wird das Versprechen zu früh aufgelöst, bevor der asynchrone Vorgang abgeschlossen ist.
Ihr Code hier resolve()
vor dem setTimeout()
Rückruf tatsächlich Feuer und damit das Versprechen zu früh gelöst ruft: sollte
var myFirstPromise2 = new Promise((resolve, reject) => {
//setTimeout models an operation that takes a long time
setTimeout(function(){console.log('finishTimeout')},60000);
resolve('success');
});
Dieser Code dies sein, wo Entschlossenheit innerhalb der setTimeout()
Rückruf aufgerufen wird, so das Versprechen nicht ist aufgelöst, bis der Timer ausgelöst hat,:
var myFirstPromise2 = new Promise((resolve, reject) => {
//setTimeout models an operation that takes a long time
setTimeout(function(){
console.log('finishTimeout');
resolve('success');
},60000);
});
Hinweis: resolve()
nur aufgerufen, wenn der Asynchron-Betrieb tatsächlich getan. Ihre Version hat sie aufgerufen, bevor die asynchrone Operation ausgeführt wurde. Daher wurde die Zusage in Ihrer Version zu früh aufgelöst, bevor die asynchrone Operation ausgeführt wurde.
Versprechen haben KEINE magischen Kräfte zu wissen, wenn asynchrone Operationen ausgeführt werden. Sie machen nur genau das, was dein Code ihnen sagt. Rufen Sie also nur resolve()
auf, wenn der asynchrone Vorgang tatsächlich ausgeführt wird.
EDIT: was ist der Unterschied Entschlossenheit innerhalb SetTimeout von nur diese zwischen setzen:
setTimeout(function() {
console.log('finishTimeout')
console.log("yay success")
},60000);
In diesem speziellen Beispiel wird dies gut funktionieren. Versprechen werden als Organisierungs- und Management-Tool für asynchrone Operationen verwendet. Sie sind äußerst nützlich, wenn Sie mehrere asynchrone Operationen ausführen müssen, die Sie sequenzieren oder koordinieren müssen, und sie sind äußerst nützlich, wenn Sie eine robuste Fehlerbehandlung mit mehreren asynchronen Operationen schreiben. Sie brauchen kein Versprechen für eine einfache, einmalige Timer-Operation.
Aber sobald Sie anfangen, Versprechungen für die hohen Nutzungen zu verwenden, werden Sie feststellen, dass sie nur eine bessere Möglichkeit sind, alle Ihre asynchronen Operationen, auch die einfacheren, zu entwerfen und zu programmieren. Sie werden feststellen, dass Sie sie für fast jede asynchrone Operation verwenden möchten. Sie müssen das nicht, aber nach meiner Erfahrung ist es einfacher und einfacher, sie für alle asynchronen Vorgänge zu verwenden.
Hinweis: Technisch gibt es einen kleinen Unterschied zwischen diesen:
setTimeout(function() {
console.log('finishTimeout')
console.log("yay success")
},60000);
Und dies:
var myFirstPromise2 = new Promise((resolve, reject) => {
//setTimeout models an operation that takes a long time
setTimeout(function(){
console.log('finishTimeout');
resolve('success');
},60000);
});
myFirstPromise2.then((successMessage) => {
console.log('yay '+successMessage);
});
Da alle .then()
Handler auf der nächsten Tick ausgeführt werden, wird es ein wenig sein Verzögerung zwischen den beiden console.log()
-Operationen im zweiten Codebeispiel (gemessen in ms) gegenüber der ersten. Es ist wahrscheinlich nicht materiell, aber da Sie gefragt haben, was der Unterschied ist, dachte ich, ich würde diesen kleinen Unterschied aufzeigen. Es gibt praktische Gründe, warum es so entworfen wird, die insgesamt eine gute Designentscheidung sind (Stacks werden abgewickelt, bevor .then()
Handler aufgerufen werden, Resolve sind durchweg asynchron, auch wenn das Versprechen synchron gelöst wird, etc ...).
Sie müssen 'resolve()' innerhalb des Callbacks des Timeout nach der 'endTimeout' Log-Anweisung aufrufen. Ihr aktueller Code ruft 'resolve()' auf, bevor die Zeitüberschreitung abgeschlossen ist. Übrigens sollte 'myFirstPromise3' nicht' myFirstPromise2' sein. – nnnnnn
Sie sollten in der Lage sein, die Auflösung innerhalb des setTimeout nach der Anweisung 'console.log ('finishTimeout)' zu setzen. 'console.log ('finishTimeout'); resole ('Erfolg'); ' –
Hier ist ein Codepen Beispiel: https://codepen.io/arecvlohe/pen/XRwjOX?editors=0012 –