Découvrez ce code :
<a href="#" id="link">Link</a>
<span>Moving</span>
$('#link').click(function () {
console.log("Enter");
$('#link').animate({ width: 200 }, 2000, function() {
console.log("finished");
});
console.log("Exit");
});
Comme vous pouvez le voir dans la console, la fonction "animer" est asynchrone, et elle "dérive" le flux du code de bloc du gestionnaire d'événements. En réalité :
$('#link').click(function () {
console.log("Enter");
asyncFunct();
console.log("Exit");
});
function asyncFunct() {
console.log("finished");
}
suivez le flux du code de bloc!
Si je souhaite créer mon function asyncFunct() { }
avec ce comportement, comment puis-je le faire avec javascript / jquery? Je pense qu'il ya une stratégie sans l'utilisation de setTimeout()
javascript
jquery
function
asynchronous
Markzzz
la source
la source
Réponses:
Vous ne pouvez pas créer une fonction asynchrone vraiment personnalisée. Vous devrez éventuellement tirer parti d'une technologie fournie de manière native, telle que:
setInterval
setTimeout
requestAnimationFrame
XMLHttpRequest
WebSocket
Worker
onload
En fait, pour l'animation que jQuery utilise
setInterval
.la source
setInterval
) mais que nous ne pouvons même pas l'ouvrir pour voir comment cela se fait. Avez-vous plus d'informations sur le sujet?setImmediate
promises
. Cela donne-t-il unawaitable
?Vous pouvez utiliser une minuterie:
(où
yourFn
est une référence à votre fonction)ou, avec Lodash :
la source
setTimeout
est de 4 millisecondes par spécification HTML5. Lui donner 0 prendra toujours ce laps de temps minimum. Mais oui, cela fonctionne bien comme un report de fonction.ici vous avez une solution simple (autre écrire à ce sujet) http://www.benlesh.com/2012/05/calling-javascript-function.html
Et ici, vous avez ci-dessus la solution prête:
TEST 1 ( peut produire '1 x 2 3' ou '1 2 x 3' ou '1 2 3 x' ):
TEST 2 ( affichera toujours 'x 1' ):
Cette fonction est exécutée avec timeout 0 - elle simulera une tâche asynchrone
la source
console.log(1)
est appelé et que la sortie (undefined
) est transmise comme deuxième argument àasync()
. Dans le cas du TEST 1, je pense que vous ne comprenez pas entièrement la file d'attente d'exécution de JavaScript. Parce que chacun des appels seconsole.log()
produisant dans la même pile,x
est garanti pour être enregistré en dernier. Je voterais contre cette réponse pour désinformation, mais je n'ai pas assez de représentants.async(function() {console.log('x')}, function(){console.log(1)});
.TEST 2 as: async(function() {console.log('x')}, function(){console.log(1)});
- je l'ai déjà corrigéVoici une fonction qui prend une autre fonction et génère une version qui s'exécute de manière asynchrone.
Il est utilisé comme un moyen simple de créer une fonction asynchrone:
C'est différent de la réponse de @ fider parce que la fonction elle-même a sa propre structure (aucun rappel ajouté, elle est déjà dans la fonction) et aussi parce qu'elle crée une nouvelle fonction qui peut être utilisée.
la source
(function(a){ asyncFunction(a); })(a)
setTimeout(asyncFunction, 0, a);
Edit: J'ai totalement mal compris la question. Dans le navigateur, j'utiliserais
setTimeout
. S'il était important qu'il s'exécute dans un autre thread, j'utiliserais Web Workers .la source
En retard, mais pour montrer une solution facile à utiliser
promises
après leur introduction dans ES6 , il gère beaucoup plus facilement les appels asynchrones:Vous définissez le code asynchrone dans une nouvelle promesse:
Remarque à définir
resolve()
lorsque l'appel asynchrone se termine.Ensuite, vous ajoutez le code que vous souhaitez exécuter après la fin de l'appel async à l'intérieur
.then()
de la promesse:En voici un extrait:
ou JSFiddle
la source
Cette page vous guide à travers les bases de la création d'une fonction javascript asynchrone.
Depuis ES2017, les fonctions javacript asynchrones sont beaucoup plus faciles à écrire. Vous devriez également en savoir plus sur les promesses .
la source
Si vous souhaitez utiliser des paramètres et réguler le nombre maximum de fonctions asynchrones, vous pouvez utiliser un simple worker async que j'ai construit:
Vous pouvez l'utiliser comme ceci:
la source
Bien que n'étant pas fondamentalement différente des autres solutions, je pense que ma solution fait quelques bonnes choses supplémentaires:
Function.prototype
permettre une meilleure façon de l'appelerDe plus, la similitude avec la fonction intégrée
Function.prototype.apply
me semble appropriée.la source
À côté de la bonne réponse de @pimvdb, et juste au cas où vous vous le demanderiez, async.js n'offre pas non plus de fonctions vraiment asynchrones. Voici une version (très) dépouillée de la méthode principale de la bibliothèque:
Ainsi, la fonction protège des erreurs et la transmet gracieusement au rappel à gérer, mais le code est aussi synchrone que toute autre fonction JS.
la source
Malheureusement, JavaScript ne fournit pas de fonctionnalité asynchrone. Cela ne fonctionne que dans un seul thread. Mais la plupart des navigateurs modernes fournissent des
Worker
s , qui sont des seconds scripts qui sont exécutés en arrière-plan et peuvent renvoyer un résultat. Donc, j'ai atteint une solution, je pense qu'il est utile d'exécuter une fonction de manière asynchrone, ce qui crée un worker pour chaque appel asynchrone.Le code ci-dessous contient la fonction
async
à appeler en arrière-plan.Voici un exemple d'utilisation:
Cela exécute une fonction qui itère un
for
avec un nombre énorme pour prendre du temps comme démonstration d'asynchronicité, puis obtient le double du nombre passé. Laasync
méthode fournit unfunction
qui appelle la fonction souhaitée en arrière-plan, et dans ce qui est fourni comme paramètre deasync
callback, lereturn
dans son paramètre unique. Donc, dans la fonction de rappel, j'aialert
le résultat.la source
MDN a un bon exemple sur l'utilisation de setTimeout en préservant "this".
Comme le suivant:
la source