Heim  >  Artikel  >  Web-Frontend  >  Versprechensprinzip

Versprechensprinzip

藏色散人
藏色散人Original
2019-07-10 10:27:323757Durchsuche

Versprechensprinzip

1. Versprechen Sie Anwendungsszenarien

1 Lösung der Rückrufhölle

Zum Beispiel müssen wir möglicherweise häufig ein Datenelement asynchron als Eingabeparameter für den nächsten asynchronen Vorgang anfordern

getData(function(a){  
    getMoreData(a, function(b){
        getMoreData(b, function(c){ 
            getMoreData(c, function(d){ 
                getMoreData(d, function(e){ 
                    ...
                });
            });
        });
    });
});

Sie können feststellen, dass der obige Code sehr beängstigend aussieht, wenn er Schicht für Schicht verschachtelt ist und die Logik komplex ist Wird Urteil hinzugefügt, wird die Lesbarkeit des Codes sehr schlecht.

Aber wenn Sie Versprechen 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 Versprechen können verwendet werden, um eine bestimmte Anfrage zu erhalten oder zu verarbeiten, nachdem mehrere Anfragen gesendet wurden. 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);
})
使用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. Umsetzung des Versprechenprinzips

1. Die einfachste Implementierung

Basierend auf dem obigen Anwendungsszenario wird festgestellt, dass Versprechen möglich ist haben drei Zustände: „Pending“, „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

Konstruieren Sie ein Promise. Die Instanz muss eine Funktion an den Promise-Konstruktor übergeben. 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 (onRejected) wird beim Ablehnen ausgeführt)

Wenn sich der Status in „Auflösen“ ändert, kann er nicht in „Ablehnen“ geändert werden und umgekehrt.

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;

Das obige ist der detaillierte Inhalt vonVersprechensprinzip. 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