1. 程式人生 > >如何用原生JS實現一個簡單的promise

如何用原生JS實現一個簡單的promise

   我又又又回來了,最近真是累的跟狗一樣,急需一個大保健回覆一下子精力

   我現在是一邊喝著紅牛一邊寫著部落格,好了好了,不扯了,迴歸整體好吧

   先簡單來說一下啥是promise吧

   它是什麼?Promise是一個方案,用來解決多層回撥巢狀的解決方案。它現在是ES6的原生物件。

      幹嘛用的?可以把一個多層巢狀的同步、非同步都有回撥的方法,給拉直為一串.then()組成的呼叫鏈。

    解決啥問題?多層巢狀的回撥方法中,如果同時存在同步、非同步的方法,那麼實際執行順序會混亂。不好除錯不好維護

   現在我們再來說一說自己寫簡單的promise的思路,我們是如何將非同步函式同步執行的呢,正常情況下,我們只需要用函式

   巢狀就可以解決,但是現在我們要封裝一個promise,那我們要怎麼做呢,其實原理還是一樣的,只要能在第一個函式執行完

   再呼叫下一個函式不就可以了嘛   

   下面還是直接上程式碼

   

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        function
MyPromise(func) { var self = this; var count = 0; this.cbklist = []; this.then = function (callback) { //將所有.then方法傳進來的引數push到陣列當中 this.cbklist.push(callback); //能實現鏈式呼叫的關鍵 return this; }
this.success = function () { //使用遞迴呼叫自身 if (count == self.cbklist.length) return; self.cbklist[count++](self.success); } //進來時呼叫第一個函式 func(self.success); } // 下面是呼叫的例子 function ajaxA(success) { setTimeout(function () { console.log("AAAAAAAAAA"); success(); }, 3000); } function ajaxB(success) { setTimeout(function () { console.log("BBBBBBBBBB"); success(); }, 2000); } function ajaxC(success) { setTimeout(function () { console.log("CCCCCCCCCC"); success(); }, 6000); } function ajaxD() { setTimeout(function () { console.log("DDDDDDDDD"); }, 2000); } new MyPromise(ajaxA).then(ajaxB).then(ajaxC).then(ajaxD); </script> </body> </html>