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, puis de l'utiliser comme paramètre d'entrée pour la prochaine donnée asynchrone. l'opération
getData(function(a){ getMoreData(a, function(b){ getMoreData(b, function(c){ getMoreData(c, function(d){ getMoreData(d, function(e){ ... }); }); }); }); });
peut être trouvée Le code ci-dessus semble très effrayant, imbriqué couche par couche, et si des jugements logiques complexes sont ajoutés, la lisibilité du code deviendra très mauvaise.
Mais si vous utilisez promise :
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.promise peut se rendre compte qu'après l'envoi de plusieurs requêtes, puis obtenir ou traiter un certain 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); })
Vous pouvez y parvenir en utilisant la promesse :
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 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 avoir trois états, à savoir pedding, Fulfilled et Rejected.
L'état initial lors de la création de l'instance d'objet Pending Promise
Réalisé peut être compris comme un état réussi
Rejeté peut être compris comme un état d'échec
·Construire une instance Promise nécessite de passer une fonction au constructeur Promise. 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 est exécutée lors de la résolution (onFulfilled), exécute la deuxième fonction (onRejected) lors du rejet
·Lorsque l'état change pour être résolu, il ne peut pas changer pour rejeter, et vice versa Même raison.
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;
Pour plus de FAQ, veuillez visiter le site Web PHP chinois.
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!