国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

自制簡單的promise

tianlai / 2168人閱讀

摘要:現在的已經是用的很廣泛的,可以有效的解決地域回調的問題。那么現在我們可以制作一個簡單的讓自己更加熟悉。我們這樣就知道了的運行機制了。

現在es6的promise已經是用的很廣泛的,可以有效的解決地域回調的問題。
那么現在我們可以制作一個簡單的promise,讓自己更加熟悉promise。

一.回顧promise

先我們需要了解一下promise的用法。以下demo

var p=new Promise(function(resolve,reject){
    setTimeout(function(){
       resolve("success")
    },1000);
    console.log("創(chuàng)建一個新的promise");
})
p.then(function(x){
  console.log(x)
})

//輸出:
創(chuàng)建一個新的promise
success

以上就是一個promise的實例。從上述例子可以看出,promise可以處理異步操作。此外還可以鏈式調用

二.了解一下promise規(guī)范https://promisesaplus.com/

我們主要關心它的要求有一下幾點:

1.一個promise必須有3個狀態(tài),pending,fulfilled(resolved),rejected當處于pending狀態(tài)的時候,可以轉移到fulfilled(resolved)或者rejected狀態(tài)。當處于fulfilled(resolved)狀態(tài)或者rejected狀態(tài)的時候,就不可變。
2.一個promise必須有一個then方法,then方法接受兩個參數:
3.為了實現鏈式調用,then方法必須返回一個promise
三.制作promise

接下來我們來制作簡單的promise,以下將分幾個版本,來循序漸進的增加內容

1) v1.0版本
function myPromise(constructor){
    let self=this;
    self.status="pending" //定義狀態(tài)改變前的初始狀態(tài)
    self.value=undefined;//定義狀態(tài)為resolved的時候的狀態(tài)
    self.reason=undefined;//定義狀態(tài)為rejected的時候的狀態(tài)
    function resolve(value){
        //兩個==="pending",保證了狀態(tài)的改變是不可逆的
       if(self.status==="pending"){
          self.value=value;
          self.status="resolved";
       }
    }
    function reject(reason){
        //兩個==="pending",保證了狀態(tài)的改變是不可逆的
       if(self.status==="pending"){
          self.reason=reason;
          self.status="rejected";
       }
    }
    //捕獲構造異常
    try{
       constructor(resolve,reject);
    }catch(e){
       reject(e);
    }
}

同時在原型鏈上增加then方法

myPromise.prototype.then=function(onFullfilled,onRejected){
   let self=this;
   switch(self.status){
      case "resolved":
        onFullfilled(self.value);
        break;
      case "rejected":
        onRejected(self.reason);
        break;
      default:       
   }
}

然后測試一下

var p=new myPromise(function(resolve,reject){resolve(1)});
p.then(function(x){console.log(x)})
//輸出1

但是我們可以發(fā)現這邊是沒有異步過程的,即then里面是沒有處理內容的

v1.1

增加異步功能

function myPromise(constructor){
    let self=this;
    self.status="pending" //定義狀態(tài)改變前的初始狀態(tài)
    self.value=undefined;//定義狀態(tài)為resolved的時候的狀態(tài)
    self.reason=undefined;//定義狀態(tài)為rejected的時候的狀態(tài)
    self.onFullfilledArray=[];
    self.onRejectedArray=[];
    function resolve(value){
       if(self.status==="pending"){
          self.value=value;
          self.status="resolved";
          self.onFullfilledArray.forEach(function(f){
                f(self.value);
                //如果狀態(tài)從pending變?yōu)閞esolved,
                //那么就遍歷執(zhí)行里面的異步方法
          });
        
       }
    }
    function reject(reason){
       if(self.status==="pending"){
          self.reason=reason;
          self.status="rejected";
          self.onRejectedArray.forEach(function(f){
              f(self.reason);
             //如果狀態(tài)從pending變?yōu)閞ejected, 
             //那么就遍歷執(zhí)行里面的異步方法
          })
       }
    }
    //捕獲構造異常
    try{
       constructor(resolve,reject);
    }catch(e){
       reject(e);
    }
}
myPromise.prototype.then=function(onFullfilled,onRejected){
   let self=this;
   switch(self.status){
      case "pending":
        self.onFullfilledArray.push(function(){
             onFullfilled(self.value)
        });
        self.onRejectedArray.push(function(){
             onRejected(self.reason)
        });
        break;
      case "resolved":
        onFullfilled(self.value);
        break;
      case "rejected":
        onRejected(self.reason);
        break;
      default:       
   }
}

現在在來測試已經可以發(fā)出then了
但是現在還無法處理鏈式調用then

v1.3

增加then鏈式調用

v1.3.1

最簡單的就是then返回一個對象,可以進行鏈式調用

myPromise.prototype.then=function(onFullfilled,onRejected){
   let self=this;
   switch(self.status){
      case "pending":
        self.onFullfilledArray.push(function(){
             onFullfilled(self.value)
        });
        self.onRejectedArray.push(function(){
             onRejected(self.reason)
        });
        break;
      case "resolved":
        onFullfilled(self.value);
        break;
      case "rejected":
        onRejected(self.reason);
        break;
      default:       
   }
   return this
}

一個簡單的this就是promise對象本身,這樣就可以了,按時this永遠都是同一個promise對象,即then里的value永遠都是相同的
因此我們需要返回一個新的promise

v1.3.2
promise.prototype.then = function(onFullfilled, onRejected) {

    var self = this
    let promise2

    switch (self.status) {
        case "pending":
            promise2 = new promise(function(resolve, reject) {
                self.onFullfilledArray.push(function() {
                    try {
                        let temple = onFullfilled(self.value)
                        resolve(temple)
                    } catch (e) {
                        reject(e)
                    }
                })
                self.onRejectedArray.push(function() {
                    try {
                        let temple = onRejected(self.reason);
                        resolve(temple)
                    } catch (e) {
                        reject(e) // error catch
                    }
                })
            })
            break;
        case "resolved":
            promise2 = new promise(function(resolve, reject) {
                try {
                    let temple = onFullfilled(self.value);
                    //將上次一then里面的方法傳遞進下一個Promise的狀態(tài)
                    resolve(temple);
                } catch (e) {
                    reject(e); //error catch
                }
            })
            break;
        case "rejected":
            promise2 = new promise(function(resolve, reject) {
                try {
                    let temple = onRejected(self.reason);
                    //將then里面的方法傳遞到下一個Promise的狀態(tài)里
                    resolve(temple);
                } catch (e) {
                    reject(e);
                }
            })
            break;
        default:
    }
    return promise2;
}

至此簡單的promise已經完成了。但是這個promise還是有不少問題的,如then里面直接使用primise等。這些都是優(yōu)化問題。
我們這樣就知道了promise的運行機制了。

覺得不錯的請點贊,謝謝。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/98750.html

相關文章

  • 從零開始寫一個 Promise

    摘要:是什么在規(guī)范中,是一個類,它的構造函數接受一個函數。在這種情況下,是但處于狀態(tài)。與一起使用關鍵字會暫停執(zhí)行一個函數,直到等待的變成狀態(tài)。此外,會一直等待調用直到下一個時序。 原文:Write Your Own Node.js Promise Library from Scratch作者:code_barbarian Promise 已經是 JavaScript 中異步處理的基石,回調...

    Binguner 評論0 收藏0
  • Java爬蟲之利用Jsoup自制簡單搜索引擎

    摘要:的官方網址為,其使用手冊網址為本次分享將實現的功能為利用爬取某個搜索詞語暫僅限英文的百度百科的介紹部分,具體的功能介紹可以參考博客爬蟲自制簡單的搜索引擎。 ??Jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數據。Jsoup的官方網址為: https:...

    GHOST_349178 評論0 收藏0
  • 自制簡單range(Vue)

    摘要:廢話不多說先上成果圖實現思路主要分界面與邏輯兩大塊界面分為個部分左滑塊長度左內容位置中間長度右滑塊長度右內容位置邏輯個事件各滑塊長度及位置計算選中時變色具體實現步驟首先我們明白整個容器的長度是不變的等于左邊中間右邊所以我們可以通過先獲取總的 廢話不多說先上成果圖 showImg(https://segmentfault.com/img/remote/1460000016345728?w...

    sunnyxd 評論0 收藏0
  • 自制簡單range(Vue)

    摘要:廢話不多說先上成果圖實現思路主要分界面與邏輯兩大塊界面分為個部分左滑塊長度左內容位置中間長度右滑塊長度右內容位置邏輯個事件各滑塊長度及位置計算選中時變色具體實現步驟首先我們明白整個容器的長度是不變的等于左邊中間右邊所以我們可以通過先獲取總的 廢話不多說先上成果圖 showImg(https://segmentfault.com/img/remote/1460000016345728?w...

    sewerganger 評論0 收藏0

發(fā)表評論

0條評論

tianlai

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<