Maison > Article > interface Web > Une analyse approfondie de l'asynchronie dans Node.js
Cet article vous donnera une introduction détaillée à Asynchronie dans Node.js. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
A propos de Node.js asynchrone, deux points ne peuvent être évités : les E/S non bloquantes et événement boucle . C'est précisément grâce à ces deux points que Node.js peut être qualifié de haute performance et être utilisé dans des environnements en ligne. Découvrons donc le mécanisme asynchrone et l'utilisation de Node.js ! [Apprentissage recommandé : "Tutoriel Nodejs"]
Input
/Output
, les entrées et sorties d'un système. Prenons l'exemple de la commande de nourriture : pour commander de la nourriture à la cantine, vous devez faire la queue. Pendant ce processus, la tante ne peut recevoir qu'une seule personne à la fois "Commande - Tante shakes". la cuillère pour charger la nourriture - En train de « vous apporter la nourriture », la tante ne peut pas accepter les commandes des autres, cela bloque les E/S lorsque vous allez au restaurant pour commander de la nourriture, vous pouvez le dire ; le serveur que vous voulez manger des tomates quand vous allez au restaurant. Des œufs brouillés, le serveur les a notés et les a remis au chef. À ce moment-là, une autre table est venue et a appelé le serveur et lui a dit qu'il voulait manger des écrevisses. Autrement dit, le serveur a accepté les autres plats avant de vous les servir. Commande humaine , il s'agit alors d'E/S non bloquantes.
La clé pour comprendre les E/S non bloquantes est d'Input
/Output
.
/Input
commande - traitement par la cuisine (tante) - service De cette façon, vous pouvez commander un repas. la nourriture est Output
, servir de la nourriture est Input
Dans cet exemple, la clé pour déterminer si les deux sont non bloquants ou bloquants est de savoir si d'autres commandes peuvent être acceptées pendant le processus de commande et de service des légumes. C'est comme si vous commandiez un Bouddha saute par-dessus le mur, l'attente pour que la nourriture soit servie peut prendre beaucoup de temps. Ensuite, les gens qui viennent commanderont des plats simples, du genre de nouilles sautées dans lesquelles on peut frire. une minute. Peut-être qu'après quelques vagues de gens qui vont et viennent, je n'ai pas encore pu vous servir à manger. Output
boucle d'événement fournie par libuv lors de son démarrage à chaque boucle d'événement. contiennent toutes 6 étapes. Ces 6 étapes seront exécutées à plusieurs reprises dans chaque boucle d'événement dans l'ordre indiqué ci-dessous, comme indiqué ci-dessous :
timers
(timer
, setTimeout
) setInterval
callbacks
idle
Phase : utilisée uniquement en interne par Node prepare
poll
check
setImmediate()
close callbacks
de socket
close
chaque étape Il y a un premier entré en premier -out (FIFO) pour l'exécution des rappels. A chaque étape de la boucle d'événements, la fonction de rappel sera retirée de la file d'attente de rappel correspondante pour exécution jusqu'à ce que le contenu de la file d'attente soit épuisé ou que l'exécution ait atteint le nombre de rappels. maximale .
Ensuite, la boucle d'événements entrera dans l'étape suivante, puis la fonction de rappel sera retirée de la file d'attente correspondant à l'étape suivante et exécutée, et cela sera répété jusqu'à la dernière étape de la boucle d'événements. La boucle d'événements sera également exécutée une par une jusqu'à la fin du processus. La relation entre les six files d'attente de macros et les micro-files d'attente dans la boucle d'événements est la suivante : Les micro-files d'attente () sont exécutées entre les différentes étapes de la boucle d'événements, ou les files d'attente de macros correspondantes à chaque étape de la boucle d'événement (microtask
). macrotask
setTimeout
, setInterval
et setImmediate
, à l'exclusion des E/S), elle sera être exécuté immédiatement File d'attente des microtâches, après avoir exécuté toutes les microtâches de la microfile d'attente, revenez tout de suite à la macroqueue pour exécuter la macrotâche suivante. Ceci est cohérent avec le fonctionnement du navigateur. callback
error-first callback
node-style callback
error
, et les paramètres suivants sont le résultat. // 第一个参数是错误捕获 interview(function (err, res) { if (err) { console.log('cry') return; } console.log('smile') }) function interview(callback) { setTimeout(() => { if (Math.random() > 0.2) { callback(null, 'success') } else { callback(new Error('fail')) } }, 500) }
Contrôle des processus asynchrones : enfer des rappels, concurrence asynchrone et autres problèmes
npm
: async.js
; async.js
thunk
Promise
Promise
resolved
rejected
pending
fulfilled
resolved
rejected
.then
.catch
resolved
Promise
.then
rejected
Promise
.catch
tout rejected
.catch
// promise的状态转换以及通过then获取内容 const promise = new Promise((resolve, reject) => { setTimeout(function () { resolve(3); // reject(new Error(4)) }, 500) }) promise.then(function (result) { console.log(result) }).catch(function (err) { console.log(err) }) setTimeout(() => { console.log(promise) }, 800)
Promise
l'exécution de , et l'état final du then
sera basé sur catch
. et Promise
Le résultat de l'exécution de la fonction de rappel détermine Promise
then
catch
Si la fonction de rappel finit par être
throw
Promise
Si le la fonction de rappel finit par être rejected
, Le return
Promise
mais si la fonction de rappel finalement resolved
obtient un return
de la fonction Promise
Promise
return
Promise
async
await
async function
La solution ultime pour la programmation asynchrone – écrivez un Promise
await
async function
Le mot-clé peut être obtenu de manière synchrone. Le résultat de l'exécution de await
Promise
peut obtenir l'erreur obtenue par try-catch
. await
(async function () { await findJob() console.log('trip') })() async function findJob() { try { // 进行三轮面试 await interview(1); await interview(2); await interview(3); console.log('smile') } catch (e) { console.log('cry at ' + e.round) } } // 进行第round轮面试 function interview(round) { return new Promise((resolve, reject) => { setTimeout(() => { if (Math.random() < 0.2) { const error = new Error('failed'); error.round = round; reject(error); } else { resolve('success'); } }, 500) }) }
function
Résumé
error
est une Promise
Une fois que l'état est déterminé comme étant ou , vous ne pouvez pas changer. passer pending
et resolved
Faire des appels en chaîne. rejected
.then
.catch
/async
de manière synchrone est la solution ultime à la programmation asynchrone. await
Pour plus de connaissances sur la programmation, veuillez visiter : Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!