1. Anwendungsszenarien versprechen
1. Lösen Sie die Rückrufhölle
Zum Beispiel müssen wir möglicherweise häufig ein Datenelement asynchron als Eingabeparameter für die nächste asynchrone Operation anfordern
getData(function(a){ getMoreData(a, function(b){ getMoreData(b, function(c){ getMoreData(c, function(d){ getMoreData(d, function(e){ ... }); }); }); }); });
kann gefunden werden Der obige Code sieht sehr beängstigend aus, Schicht für Schicht verschachtelt, und wenn komplexe logische Urteile hinzugefügt werden, wird die Lesbarkeit des Codes sehr schlecht.
Aber wenn Sie Promise verwenden:
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 })
Machen Sie den obigen Code prägnanter
getData() .then(a => getMoreData(a)) .then(b => console.log(b));
2.promise kann erkennen, dass nach dem Senden mehrerer Anfragen dann oder erhalten wird Verarbeiten Sie ein bestimmtes Ergebnis
// 两个数据都回来之后再进行操作 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); })
Sie können es erreichen, indem Sie Versprechen verwenden:
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. Umsetzung des Versprechensprinzips
1. Die einfachste Implementierung
Basierend auf dem obigen Anwendungsszenario wird festgestellt, dass Versprechen drei Zustände haben können, nämlich „pedding“, „Erfüllt“ und „Abgelehnt“.
Der Anfangszustand, wenn die Objektinstanz „Pending Promise“ erstellt wird
Erfüllt kann als erfolgreicher Zustand verstanden werden
Abgelehnt kann als fehlgeschlagener Zustand verstanden werden
·Das Erstellen einer Promise-Instanz erfordert die Übergabe einer Funktion an den Promise-Konstruktor. Die übergebene Funktion muss über zwei formale Parameter verfügen, die beide Funktionstypparameter sind. Sie sind Entschlossenheit bzw. Ablehnung.
·Es gibt auch eine Then-Methode für Promise. Die Then-Methode wird verwendet, um die Operation anzugeben, die ausgeführt werden soll, wenn sich der Status des Promise-Objekts ändert Die erste Funktion wird beim Auflösen ausgeführt (onFulfilled), die zweite Funktion (onRejected) beim Ablehnen ausgeführt
·Wenn sich der Status zum Auflösen ändert, ist dies nicht möglich Ändern in „Ablehnen“ und umgekehrt. Aus demselben Grund.
Basierend auf der obigen Beschreibung können wir ein solches Versprechen umsetzen
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;
Weitere FAQ finden Sie auf der chinesischen PHP-Website.
Das obige ist der detaillierte Inhalt vonWas ist das Prinzip des Versprechens?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!