Sfortunatamente, JavaScript non fornisce una funzionalità asincrona. Funziona solo in un singolo thread. Ma la maggior parte dei browser moderni fornisce Worker
s, che sono i secondi script che vengono eseguiti in background e possono restituire un risultato. Quindi, ho raggiunto una soluzione, penso che sia utile per eseguire in modo asincrono una funzione, che crea un worker per ogni chiamata asincrona.
Il codice seguente contiene la funzioneasync
per chiamare in background.
Function.prototype.async = function(callback) {
let blob = new Blob([ "self.addEventListener('message', function(e) { self.postMessage({ result: (" + this + ").apply(null, e.data) }); }, false);" ], { type: "text/javascript" });
let worker = new Worker(window.URL.createObjectURL(blob));
worker.addEventListener("message", function(e) {
this(e.data.result);
}.bind(callback), false);
return function() {
this.postMessage(Array.from(arguments));
}.bind(worker);
};
Questo è un esempio per l'utilizzo:
(function(x) {
for (let i = 0; i < 999999999; i++) {}
return x * 2;
}).async(function(result) {
alert(result);
})(10);
Questa esegue una funzione che itera un for
con un numero enorme di prendere tempo, come dimostrazione di asincronia, e quindi ottiene il doppio il numero passato. Il metodo async
fornisce un function
che chiama la funzione desiderata in background e in ciò che è fornito come parametro dei callback async
lo return
nel suo parametro univoco. Quindi nella funzione di richiamata I alert
il risultato.
fonte
2017-11-12 00:14:57
dai un'occhiata ai sorgenti di jQuery :) – yatskevich
Il mathod .animate() usa un callback. Animate chiamerà il callback quando l'animazione è completa. Se hai bisogno dello stesso comportamento di .animate(), ciò di cui hai bisogno è un callback (chiamato dalla funzione "main" dopo alcune altre operazioni). È diverso se hai bisogno di una funzione asincrona "completa" (una funzione chiamata senza bloccare il flusso di esecuzione). In questo caso è possibile utilizzare setTimeout() con un ritardo vicino allo 0. –
@Fabio Buda: perché callback() dovrebbe implementare una sorta di async? Infatti, non è http://jsfiddle.net/5H9XT/9/ – markzzz