首頁 > web前端 > js教程 > 主體

JavaScript實作promise的方法(程式碼範例)

不言
發布: 2019-01-10 10:34:19
轉載
2071 人瀏覽過

這篇文章帶給大家的內容是關於php讀取CSV檔案的方法介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

let promise = new Promise((resolve111, reject) => {
    //这里放入我们要执行的函数,可能是同步,也可能是异步, 这里我们就来写一个异步的执行
    setTimeout(() => {
        resolve111('hello');
    }, 100)
})
    
promise.then(data => {
    console.log(data);
    return new Promise(function(res, rej) {
        setTimeout(function() {
            console.log(2);
            res();
        }, 100)
    })
}, err => {console.log(err)})
登入後複製

promise的執行流程如下:

JavaScript實作promise的方法(程式碼範例)

var i = 1
function Promise(fn) {
    this.id = i++;
    this.status = 'PENDING';
    this.value = null;
    this.deffered = [];
    fn.call(this, this.resolve.bind(this), this.reject.bind(this))
}

Promise.prototype = {
    constructor: Promise,
    then: function(onfulfilled, onrejected) {
        var obj = {
            onfulfilled: onfulfilled,
            onrejected: onrejected
        }
        obj.promise = new this.constructor(function() {});
        console.log(this.status)
        if (this.status === 'PENDING') {
            this.deffered.push(obj);
        }
        console.log(this.deffered)
        return obj.promise;
    },
    resolve: function(data) {
        this.status = 'FULFILLED';
        this.value = data;
        this.deffered.forEach(item => {
            let p = item.onfulfilled(this.value);
            if (p && p.constructor === Promise) {
                p.deffered = item.promise.deffered;
            }
        });
    },
    reject: function(err) {
        this.status = 'REJECTED';
        this.value = err;
        this.deffered.forEach(item => {
            let p = item.onrejected(this.value);
            if (p && p.constructor === Promise) {
                p.deffered = item.promise.deffered;
            }
        });
    }
}
登入後複製

then方法需要傳回一個新的子Promise, 且前後的Promise需要建立聯繫,才能決定他們的執行順序。這裡用id標識每個promise。

Promise鍊式操作中,執行順序是如何保證的

#每個promise後面鏈一個物件該物件包含onfulfiled,onrejected,子promise三個屬性,當父promise 狀態改變完畢,執行完對應的onfulfiled/onfulfiled的時候呢,拿到子promise,在等待這個子promise狀態改變,再執行對應的onfulfiled/onfulfiled。依序循環直到目前promise沒有子promise

如何讓異步的value在thenable函數拿到

將resolve/reject函數和onfulfiled/onrejected放入同一個物件(promise物件)裡面,resolve/reject的時候將value設定this.value=xxx。 onfulfiled/onrejected執行的時候呢,onfulfiled(this.value)即可。

在這裡避免頭暈,解釋一下,onfulfilled和onrejected指的是then裡面的兩個函數。

狀態機制切換

如圖所示,狀態只能由pengding-->fulfilled,或由pending-->rejected這樣轉換。

只要這兩種情況發生,狀態就凝固了,不會再改變了,會一直維持這個結果。就算改變已經發生了,你再對Promise物件加入回呼函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特徵是,如果你錯過了它,再去監聽,是得不到結果的。

以上是JavaScript實作promise的方法(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板