Fonction Async sans attendre en Javascript
J'ai deux fonctions a
et b
qui sont asynchrones, l'ancien sans await
et, plus tard, avec await
. Ils ont tous les deux journaux de quelque chose de la console et de retour undefined
. Après l'appel, soit de la fonction que j'journal d'un autre message et regarde si le message est écrit avant ou après l'exécution du corps de la fonction.
JS:
function someMath() {
for (let i = 0; i < 3000000; i++) { Math.sqrt(i**5) }
}
function timeout(n) {
return new Promise(cb => setTimeout(cb, n))
}
//------------------------------------------------- a (no await)
async function a() {
someMath()
console.log('in a (no await)')
}
//---------------------------------------------------- b (await)
async function b() {
await timeout(100)
console.log('in b (await)')
}
clear.onclick = console.clear
aButton.onclick = function() {
a()
console.log('after a (no await) call')
}
bButton.onclick = function() {
b()
console.log('after b (await) call')
}
HTML:
<button id="aButton">test without await</button>
<button id="bButton">test with await</button>
<button id="clear">clear console</button>
Si vous lancez le test sans await
la fonction semble fonctionner comme si c'était synchrone. Mais avec await
, les messages sont inversé que la fonction est exécutée de manière asynchrone.
Donc ma question est: comment exécuter javascript async
fonctions lorsqu'aucune await
mot-clé est présent?
Réel de cas d'utilisation: j'ai un await
mot-clé qui est conditionnellement exécuté, et j'ai besoin de savoir si la fonction est exécutée de manière synchrone ou non afin de rendre mon élément:
async function initializeComponent(stuff) {
if (stuff === undefined)
stuff = await getStuff()
//initialize
if (/* context has been blocked */)
renderComponent() //render again if stuff had to be loaded
}
initializeComponent()
renderComponent()
P. S: le titre a le javascript mot-clé pour éviter la confusion avec les mêmes questions dans d'autres langues (j'.e À l'aide asynchrone sans attendre)
- Vous avez également besoin de convertir
bButton.onclick
fonction dans une fonction async et await pourb()
pour terminer, afin d'obtenir le journal désiré. - Je ne veux pas attendre pour le journal, je veux savoir avec l'aide ou non à l'aide de
await
mot-clé modifie la fonction synchrone. Et si elle ne le fait pas, peut-être pourquoi mon test est faux. Je vais mettre à jour avec mon vrai cas d'utilisation à la fin, ce sera peut-être plus clair pour vous. - Lecture recommandée - medium.com/javascript-in-plain-english/...
Vous devez vous connecter pour publier un commentaire.
de mozilla doc:
Comme vous l'avez supposé, si aucune attendent est présent à l'exécution n'est pas suspendue et votre code sera exécuté de manière synchrone.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function#Description
async
mot-clé? Je ne pense pas synchrone fonctions devraient l'avoirawait
est que les exceptions seront rejetées à la place de façon synchrone levée. par exemple,const result = someAsyncFunctionWithoutAwait().catch(handleRejection)
async
et n'utilisant pas deawait
, ne bloque pas, comme prévu... Donc si il ne bloque pas, cela signifie qu'il est exécutée de manière asynchrone, à droite? Voici l'exemple:f = () => new Promise((resolve, reject) => setTimeout(() => resolve(console.log('hello')), 2000));
et de l'appeler comme(() => { f(); console.log('world') })()
donne "monde", puis "undefined", puis "bonjour" ... Alors, pourquoi aurais-je besoin de marquer une fonctionasync
si je ne suis pas en utilisantawait
?La fonction est exécutée de la même avec ou sans
await
. Ceawait
n'est automatiquement attendre la promesse qui est retourné par la fonction à régler.est à peu près équivalent à:
La
async function
déclaration rend tout simplement la fonction de retour automatique d'une promesse qui est résolu lorsque la fonction retourne.Tout est synchrone jusqu'à ce qu'un Javascript asynchrone fonction est exécutée. En utilisant asynchrone attendent
await
est asynchrone et tout ce qui suit vous attendent, est placé dans la file d'attente des événements. Semblable à.then()
.Pour mieux expliquer prenez cet exemple:
Comme
await
est asynchrone et le reste tous est synchrone, y compris la promesse donc la sortie estUn comportement similaire de
main()
est sans promesse trop:De sortie:
Juste de retirer
await
fera toutasync
fonction synchrone qui il est.De sortie:
await
ne peut être utilisé à l'intérieur deasync
fonction.