Maison > Problème commun > le corps du texte

Quel est le principe de la promesse ?

爱喝马黛茶的安东尼
Libérer: 2020-01-06 15:19:44
original
9182 Les gens l'ont consulté

Quel est le principe de la 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, puis de l'utiliser comme paramètre d'entrée pour la prochaine donnée asynchrone. l'opération

getData(function(a){  
    getMoreData(a, function(b){
        getMoreData(b, function(c){ 
            getMoreData(c, function(d){ 
                getMoreData(d, function(e){ 
                    ...
                });
            });
        });
    });
});
Copier après la connexion

peut être trouvée Le code ci-dessus semble très effrayant, imbriqué couche par couche, et si des jugements logiques complexes sont ajoutés, la lisibilité du code deviendra très mauvaise.

Mais si vous utilisez promise :

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
})
Copier après la connexion

Rendre le code ci-dessus plus concis

getData()
.then(a => getMoreData(a))
.then(b => console.log(b));
Copier après la connexion

2.promise peut se rendre compte qu'après l'envoi de plusieurs requêtes, puis obtenir ou traiter un certain 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);
})
Copier après la connexion

Vous pouvez y parvenir en utilisant la promesse :

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);
});
Copier après la connexion

2. Mise en œuvre du principe de 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 avoir trois états, à savoir pedding, Fulfilled et Rejected.

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

Réalisé peut être compris comme un état réussi

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

·Construire une instance Promise nécessite de passer une fonction au constructeur Promise. 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 est exécutée lors de la résolution (onFulfilled), exécute la deuxième fonction (onRejected) lors du rejet

·Lorsque l'état change pour être résolu, il ne peut pas changer pour rejeter, et vice versa Même raison.

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;
Copier après la connexion

Pour plus de FAQ, veuillez visiter le site Web PHP chinois.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!