首頁  >  文章  >  web前端  >  promise原理

promise原理

藏色散人
藏色散人原創
2019-07-10 10:27:323674瀏覽

promise原理

一、 promise應用場景

1 解決回呼地獄

#例如我們經常可能需要非同步請求一個資料之後作為下一個非同步操作的入參

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

可以發現上面的程式碼看起來是非常可怕的,層層嵌套,如果在加上複雜的邏輯判斷,程式碼可讀性會變得非常差。

但是你如果使用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
})

把上面程式碼再簡潔點兒

getData()
.then(a => getMoreData(a))
.then(b => console.log(b));

2 promise 可以實現在多個請求發送完成後再得到或處理某個結果

// 两个数据都回来之后再进行操作
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);
});

二、promise原理實作

1.最簡單的實作######基於上面的應用場景發現promise可以有三種狀態,分別是pedding 、Fulfilled、 Rejected。 ######Pending Promise物件實例建立時候的初始狀態######Fulfilled 可以理解為成功的狀態######Rejected可以理解為失敗的狀態#######建構一個Promise實例需要給Promise建構函式傳入一個函式。傳入的函數需要有兩個形參,兩個形參都是function類型的參數。分別是resolve和reject。 ######Promise上還有then方法,then 方法就是用來指定Promise 物件的狀態改變時決定執行的操作,resolve 時執行第一個函數(onFulfilled),reject時執行第二個函數(onRejected )######當狀態變成resolve時便不能再變成reject,反之同理。 ######基於上面描述我們可以實作一個這樣的promise###
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;

以上是promise原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn