principe de promesse

藏色散人
藏色散人original
2019-07-10 10:27:323787parcourir

principe de promesse

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 comme paramètre d'entrée pour la prochaine opération asynchrone

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

Vous pouvez constater que le code ci-dessus semble très effrayant, imbriqué couche par couche, si la logique est complexe est ajouté Jugement, la lisibilité du code deviendra très mauvaise.

Mais si vous utilisez des promesses :

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 promesses peuvent être utilisées pour obtenir ou traiter une certaine demande après l'envoi de plusieurs demandes. 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);
})
使用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. Mise en œuvre du principe de la 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. ont trois états, ils sont respectivement en attente, exécuté et rejeté.

L'état initial lors de la création de l'instance d'objet Pending Promise

Réalisé peut être compris comme l'état réussi

Rejeté peut être compris comme l'état d'échec

Construire une promesse L'instance doit transmettre une fonction au constructeur de la promesse. 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 (onFulfilled) est exécutée lors de la résolution, et la seconde. La fonction (onRejected) est exécutée lors du rejet. )

Lorsque le statut passe à résolu, il ne peut pas changer à rejeter, et vice versa.

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;

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn