Cet article vous présentera NodejsPromise dans la programmation asynchrone et vous présentera en quoi Promise est meilleure que le rappel.
【Apprentissage recommandé : "Tutoriel Nodejs"】
Promise est une solution de programmation asynchrone !
(function () { const res = new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 500); }); console.log("500ms", res); setTimeout(() => { console.log("800ms", res); }, 800); })();
Imprimer le contenu suivant
Le résultat est conforme à nos attentes
promesse
immédiatement, à ce moment, la promesse
est dans l'état en attente
promise
的结果,此时promise
处于pending
状态promise
的结果,此时promise
处于fulfilled
状态(function () { const res = new Promise((resolve, reject) => { setTimeout(() => { reject(new Error("error")); }, 500); }); console.log("500ms", res); setTimeout(() => { console.log("800ms", res); }, 800); })();
打印出如下内容
结果是符合我们的预期的
promise
的结果,此时promise
处于pending
状态promise
的结果,此时promise
处于reject
状态注意:如果当
pengding
状态进入到reject
状态,这个错误又没有正确捕获的话,这个错误就会被抛到 JS 的全局
(function () { const res = new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 300); setTimeout(() => { reject(new Error("error")); }, 500); }); console.log("500ms", res); setTimeout(() => { console.log("800ms", res); }, 800); })();
打印出如下内容
可以发现!
在 300ms 的时候promise
的状态已经切换到了resolve
, 切换后永远也无法到达reject
状态
pending
只能流转到 resolve
或者 reject
;resolve
和 reject
不能互相流转;(function () { const res = new Promise((resolve, reject) => { setTimeout(() => { resolve(3); }, 300); }) .then((result) => { console.log("result", result); }) .catch((error) => { console.log("error", error); }); console.log("300ms", res); setTimeout(() => { console.log("800ms", res); }, 800); })();
打印出如下内容
可以发现
then
是 promise
的状态流转到 reslove
状态可以拿到的结果(function () { const res = new Promise((resolve, reject) => { setTimeout(() => { reject(new Error("error-3")); }, 300); }) .then((result) => { console.log("result", result); }) .catch((error) => { console.log("error", error); }); console.log("300ms", res); setTimeout(() => { console.log("800ms", res); }, 800); })();
打印出如下内容
可以发现
catch
是 promise
的状态流转到 reject
状态可以拿到的结果, 并且之前全局的 JS 错误已经可以被 catch
捕获到了
.then .catch 总结
resolved
状态的 Promise 会回调后面的第一个 .then
rejected
状态的 Promise 会回调后面的第一个 .catch
rejected
状态切后面没有 .catch
的 Promise 会造成 Js 环境的全局错误我们继续之前面试的例子
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一个参数 resolve("success"); } else { reject(new Error("fail")); } }, 1000); }); } (function () { const res = interview(); res .then((result) => { console.log("面试成功!我笑了"); }) .catch((error) => { console.log("面试失败!我哭了"); }); })();
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一个参数 resolve("success"); } else { reject(new Error("fail")); } }, 500); }); } (function () { const promsie1 = interview(); const promsie2 = promsie1.then((result) => { throw new Error("面试成功!我笑了,但是我拒绝了"); }); setTimeout(() => { console.log("promsie1", promsie1); console.log("promsie2", promsie2); }, 800); })();
以上代码可以看出 ,**.then
返回一个全新的 Promise, 此 Promise 的结果状态是由 .then
的回调函数的结果来决定的
throw
, 则进入 rejectedreturn
Vous devez attendre un certain temps avant de pouvoir obtenir le résultat de la promesse
. cette fois, la promesse
est au statut réalisée
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0) { // resolve, reject 只能接受一个参数 resolve("success"); } else { reject(new Error("fail")); } }, 500); }); } (function () { const promsie1 = interview(); const promsie2 = promsie1.catch((result) => { return "虽然面试失败,但我还是笑了"; }); setTimeout(() => { console.log("promsie1", promsie1); console.log("promsie2", promsie2); }, 800); })();
promesse
est dans le en attente</code. > état. Vous devez attendre un certain temps avant de pouvoir obtenir le résultat de <code>promesse
. À ce stade, promesse
est dans le rejeter
. state🎜🎜🎜Remarque : Si l'étatpengding
entre dans l'étatreject
, si cette erreur n'est pas capturée correctement, cette erreur sera renvoyée au JS global🎜
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一个参数 resolve("success"); } else { reject(new Error("fail")); } }, 500); }); } (function () { const promsie1 = interview(); const promsie2 = promsie1 .then((result) => { return new Promise(function (resolve, reject) { setTimeout(() => { resolve("面试成功!,给我400ms 总结一下"); }, 400); }); }) .catch((result) => { return new Promise(function (resolve, reject) { setTimeout(() => { resolve("面试失败,给我400ms 总结一下"); }, 400); }); }); setTimeout(() => { console.log("800ms promsie1", promsie1); console.log("800ms promsie2", promsie2); }, 800); setTimeout(() => { console.log("1000ms promsie1", promsie1); console.log("1000ms promsie2", promsie2); }, 1000); })();
promise
a été basculé sur resolve
Après le changement, il n'atteindra jamais l'état reject
🎜🎜🎜<. code>en attente ne peut être transféré que vers resolve
ou reject
;🎜🎜resolve
et reject
ne peuvent pas être transférés les uns aux autres ;🎜 🎜// round 面试第几轮 function interview(round) { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一个参数 resolve("success"); } else { const error = new Error("fail"); reject({ round, error }); } }, 500); }); } (function () { interview(1) .then(() => { return interview(2); }) .then(() => { return interview(3); }) .then(() => { console.log("每轮面试都成功!我开心的笑了"); }) .catch((err) => { console.log(`第${err.round}轮面试失败了`); }); })();
alors< /code> est une <code>promesse</code > Le statut passe au statut <code>reslove
et le résultat peut être obtenu🎜🎜// round 面试第几轮 function interview(name) { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一个参数 resolve("success"); } else { const error = new Error("fail"); reject({ name, error }); } }, 500); }); } (function () { Promise.all([interview("tenxun"), interview("ali"), interview("baidu")]) .then(() => { console.log("每家公司都面试成功了"); }) .catch((err) => { console.log(`面试${err.name}失败了`); }); })();
catch< /code> est le flux d'état de <code>promise
. Les résultats peuvent être obtenus lorsque l'état reject
est atteint, et les erreurs JS globales précédentes peuvent déjà être capturées par catch
🎜🎜🎜.then .catch summary🎜🎜🎜🎜🎜résolu
rappellera le premier .then
🎜🎜🎜🎜rejeté
La promesse dans l'état rappellera le premier .catch
🎜🎜🎜🎜Tout commutateur d'état rejeté
sans promesse de .catch< /code> provoquera une erreur globale dans l'environnement Js🎜🎜🎜<h2 data-id="heading-6">🎜Les avantages de Promise par rapport au rappel🎜🎜<h3 data-id="heading-7">🎜 Résoudre les problèmes de contrôle de processus asynchrone - l'enfer des rappels🎜🎜🎜Continuons l'exemple de l'interview précédente🎜<h4 data-id="heading-8">🎜Utilisez Promise pour transformer la fonction d'interview précédente🎜🎜rrreee<h4 data-id= "heading-9">🎜.puis pour tester la situation où une erreur est générée🎜🎜rrreee🎜<img src ="https://img.php.cn/upload/image/380/332/132/162562900612334Une analyse approfondie de Promise dans la programmation asynchrone Nodejs " title="162562900612334Une analyse approfondie de Promise dans la programmation asynchrone Nodejs" alt="Une analyse approfondie de Promise dans la programmation asynchrone Nodejs"/>🎜🎜Comme vous pouvez le voir dans le code ci-dessus, <code>**.then
renvoie une toute nouvelle promesse. Le statut du résultat de cette La promesse est déterminée par le résultat de la fonction de rappel de .then
🎜🎜🎜🎜Si la fonction de rappel est finalement throw
, alors entrez rejeté🎜🎜🎜🎜Si la fonction de rappel est enfin retour
, puis entrez le test de valeur normale en résolu🎜🎜🎜🎜🎜.catch🎜🎜rrreee🎜 🎜🎜.catch
返回一个全新的 Promise, 此 Promise 的结果状态是由 .catch
的回调函数的结果来决定的
throw
, 则进入 rejectedreturn
,则进入 resolvedfunction interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一个参数 resolve("success"); } else { reject(new Error("fail")); } }, 500); }); } (function () { const promsie1 = interview(); const promsie2 = promsie1 .then((result) => { return new Promise(function (resolve, reject) { setTimeout(() => { resolve("面试成功!,给我400ms 总结一下"); }, 400); }); }) .catch((result) => { return new Promise(function (resolve, reject) { setTimeout(() => { resolve("面试失败,给我400ms 总结一下"); }, 400); }); }); setTimeout(() => { console.log("800ms promsie1", promsie1); console.log("800ms promsie2", promsie2); }, 800); setTimeout(() => { console.log("1000ms promsie1", promsie1); console.log("1000ms promsie2", promsie2); }, 1000); })();
如果在 .catch
,.then
中 返回 Promise, 则会等待此 Promise 的执行结果
如果回调函数最终 return 了 Promise,该 promise 和回调函数的 return 的 Promsie 状态保持一致, 这就表示了可以 在 Promise 的链式调用里面串行的执行多个异步任务!
// round 面试第几轮 function interview(round) { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一个参数 resolve("success"); } else { const error = new Error("fail"); reject({ round, error }); } }, 500); }); } (function () { interview(1) .then(() => { return interview(2); }) .then(() => { return interview(3); }) .then(() => { console.log("每轮面试都成功!我开心的笑了"); }) .catch((err) => { console.log(`第${err.round}轮面试失败了`); }); })();
Promise 的 .then .catch 把回调地狱变成了一段线性的代码!
// round 面试第几轮 function interview(name) { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一个参数 resolve("success"); } else { const error = new Error("fail"); reject({ name, error }); } }, 500); }); } (function () { Promise.all([interview("tenxun"), interview("ali"), interview("baidu")]) .then(() => { console.log("每家公司都面试成功了"); }) .catch((err) => { console.log(`面试${err.name}失败了`); }); })();
更多编程相关知识,请访问:编程视频!!
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!