Maison >interface Web >Questions et réponses frontales >principe de promesse
1. Scénarios d'application de promesse
1 Résoudre l'enfer des rappels
Par exemple, nous pouvons souvent avoir besoin de demander une donnée de manière asynchrone comme paramètre d'entrée pour la prochaine opération asynchrone
getData(function(a){ getMoreData(a, function(b){ getMoreData(b, function(c){ getMoreData(c, function(d){ getMoreData(d, function(e){ ... }); }); }); }); });
Vous pouvez constater que le code ci-dessus semble très effrayant, imbriqué couche par couche, si la logique est complexe est ajouté Jugement, la lisibilité du code deviendra très mauvaise.
Mais si vous utilisez des promesses :
function getData() { return new Promise(function (resolve, reject) { resolve(1); }); } function getMoreData(arg) { return new Promise(function (resolve, reject) { resolve(arg + 10); }); } getData().then(function (a) { console.log(a); // 1 return getMoreData(a); }).then(function (b) { console.log(b); // 11 })
Rendre le code ci-dessus plus concis
getData() .then(a => getMoreData(a)) .then(b => console.log(b));
2 promesses peuvent être utilisées pour obtenir ou traiter une certaine demande après l'envoi de plusieurs demandes. Résultat
// 两个数据都回来之后再进行操作 let fs = require('fs'); fs.readFile('./1.txt', 'utf8', function (err, data) { console.log(data); }) fs.readFile('./2.txt', 'utf8', function (err, data) { console.log(data); }) 使用promise的话就可以实现: let fs = require('fs'); function read(url){ return new Promise(function(resolve,reject){ fs.readFile(url,'utf8',function(err,data){ if(err)reject(err); resolve(data); }) }) } Promise.all([read('1.txt'),read('2.txt')]).then(data=>{ console.log(data); },err=>{ console.log(err); });
2. Mise en œuvre du principe de la promesse
1 La mise en œuvre la plus simple
Sur la base du scénario d'application ci-dessus, il s'avère que la promesse peut. ont trois états, ils sont respectivement en attente, exécuté et rejeté.
L'état initial lors de la création de l'instance d'objet Pending Promise
Réalisé peut être compris comme l'état réussi
Rejeté peut être compris comme l'état d'échec
Construire une promesse L'instance doit transmettre une fonction au constructeur de la promesse. La fonction transmise doit avoir deux paramètres formels, qui sont tous deux des paramètres de type fonction. Ils sont respectivement résolus et rejetés.
Il existe également une méthode then sur Promise. La méthode then est utilisée pour spécifier l'opération à effectuer lorsque l'état de l'objet Promise change. La première fonction (onFulfilled) est exécutée lors de la résolution, et la seconde. La fonction (onRejected) est exécutée lors du rejet. )
Lorsque le statut passe à résolu, il ne peut pas changer à rejeter, et vice versa.
Sur la base de la description ci-dessus, nous pouvons mettre en œuvre une telle promesse
function Promise(executor){ //executor执行器 let self = this; self.status = 'pending'; //等待态 self.value = undefined; // 表示当前成功的值 self.reason = undefined; // 表示是失败的值 function resolve(value){ // 成功的方法 if(self.status === 'pending'){ self.status = 'resolved'; self.value = value; } } function reject(reason){ //失败的方法 if(self.status === 'pending'){ self.status = 'rejected'; self.reason = reason; } } executor(resolve,reject); } Promise.prototype.then = function(onFufiled,onRejected){ let self = this; if(self.status === 'resolved'){ onFufiled(self.value); } if(self.status === 'rejected'){ onRejected(self.reason); } } module.exports = Promise;
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!