Je lisais Ne bloquez pas la boucle d'événement du guide Node.js. Il y avait une ligne disant:
Vous devez vous assurer de ne jamais bloquer la boucle d'événement. En d'autres termes, chacun de vos rappels JavaScript doit se terminer rapidement. Ceci s'applique bien sûr également à vos
await
's, vosPromise.then
', et ainsi de suite.
J'ai commencé à me demander si, si la résolution de certains appels API de la base de données que je suis await
ing prend du temps, cela signifie-t-il que j'ai bloqué la boucle d'événements avec cet appel await
?
Après cela, j'ai commencé à tester certains codes auto-écrits, mais je n'ai toujours pas compris comment bloquer await
fonctionne. Voici quelques codes de test:
En supposant que j'utilise express pour les tests. Je comprends pourquoi l’appel de 2 API à la route /test
bloque la boucle d’événements dans ce cas.
function someHeavyWork() {
// like calling pbkdf2 function
}
app.get('/test', (req, res) => {
someHeavyWork();
res.json(data);
});
Mais cela n'arrive pas dans ce cas.
function fakeDBCall() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(data);
}, 5000)
})
}
app.get('/test', async (req, res) => {
const data = await fakeDbCall();
res.json(data);
})
C'est peut-être à cause de mon incompréhension du fonctionnement du blocage dans le cas de async/await
.
Contrairement à ce qui semble être, await
ne bloque pas. C'est justesucre syntaxiquesur les promesses. Rien n'est bloqué; cela peut sembler bloquant pour permettre au code d'être synchrone, mais ce n'est que du sucre sur les promesses. Par exemple, cela peut sembler synchrone:
const response = await fetch(…);
const json = await response.json();
const foo = JSON.parse(json); // Using json here, even though my request was async!
Mais ce n'est pas. Une fois que vous le désirez, vous n’obtenez que des promesses non bloquantes:
fetch(…)
.then(response => response.json())
.then(json => {
const foo = JSON.parse(json);
});
Ce serait absolument catastrophique si await
bloquait. Les exécutions JavaScript sont généralement thread unique. Cela signifie que l'interaction utilisateur et les autres processus cesseraient chaque fois que vous feriez une demande ou toute autre opération asynchrone telle que l'utilisation du système de fichiers. Sur une note connexe, il s’agit, avec les importations dynamiques, du principal argument contre le niveau supérieur await
wait fait pas bloque le eventloop. En fait, lorsque javascript voit votre await
, il passera immédiatement le contrôle à la boucle d'événements.
La fonction asynchrone retourne une promesse et vous transmettez la demande et la réponse, je changerais le Res.json (données) En Retournera res.json (données)
Quand une fonction asynchrone retourne une valeur, la promesse est résolue, si la fonction contient une erreur, la promesse est rejetée juste pour la propreté, le retour du res.json (data) résoudra la fonction.