Non è necessario jquery del differita quando è possibile utilizzare JavaScript promises invece.
function first() {
return new Promise(function(resolve, reject) {
setTimeout((function() {
$('#q').append('first <br>');
resolve("Stuff worked!");
}), 1000);
});
}
function second() {
$('#q').append('second <br>');
}
function third() {
$('#q').append('third <br>');
}
first().then(second).then(third);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="q"></div>
Un altro modo di eseguire l'ultima riga first().then(second).then(third);
è rendendolo
first().then(function() {
second();
third();
});
che si può fare poiché si sa il secondo e terzo funzioni sono funzioni sincrone a differenza del prima funzione che è asincrona.
EDIT: Il motivo dietro l'utilizzo di una promessa javascript o nella risposta di guest271314 un jquery differito è perché se si voleva riutilizzare prima ma chiamare qualcosa oltre al primo o al secondo dopo averlo fatto in una parte diversa del codice si poteva semplicemente scrivere qualcosa per l'effetto di
first().then(function() {
fourth();
fifth();
});
E lo si scriverà senza modificare la funzione per prima. Promesse e posticipati rendono il codice asincrono più riutilizzabile.
EDIT:
È ora possibile anche provare async/await attesa della promessa timeout prima di eseguire prima seconda e terza.
function timeout (ms) {
return new Promise(res => setTimeout(res,ms));
}
function first() {
// $('#q').append('first <br>');
console.log("first");
}
function second() {
// $('#q').append('second <br>');
console.log("second");
}
function third() {
// $('#q').append('third <br>');
console.log("third");
}
async function fireEvents() {
await timeout(1000);
first();
second();
third();
}
console.log("started");
fireEvents().then(()=>console.log("done"));
console.log("after fireEvents");
Hai provato a scrivere il codice alla fine della funzione di timeout per sé? –
quelli setTimeout sono asincroni quindi non sappiamo quale sarà eseguito prima –