Heim > häufiges Problem > Hauptteil

Was ist das Prinzip des Versprechens?

爱喝马黛茶的安东尼
Freigeben: 2020-01-06 15:19:44
Original
9236 Leute haben es durchsucht

Was ist das Prinzip des Versprechens?

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){ 
                    ...
                });
            });
        });
    });
});
Nach dem Login kopieren

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
})
Nach dem Login kopieren

Machen Sie den obigen Code prägnanter

getData()
.then(a => getMoreData(a))
.then(b => console.log(b));
Nach dem Login kopieren

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);
})
Nach dem Login kopieren

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);
});
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!