Heim >häufiges Problem >Was ist das Prinzip des Versprechens?

Was ist das Prinzip des Versprechens?

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼Original
2020-01-06 15:19:449301Durchsuche

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){ 
                    ...
                });
            });
        });
    });
});

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!

Stellungnahme:
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
Vorheriger Artikel:Was ist ein Abschlussball?Nächster Artikel:Was ist ein Abschlussball?