<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                1.在 new Promise的時候接受一個方法,方法中有resolve和reject兩個方法,分別對應promise狀態改變時的操作 2.promise對象內部存在三種狀態,分別是 pending, fulfilled, rejected,promise 3.對象在創建的時候,會立即執行其中傳入的方法,并且通過resolve和reject方法改變status 4.當 promise.then執行的時候,會傳入onFulfilled和onRejected方法,這時候會檢查promise內部狀態,這里存在三種情況: 一個是pending的時候,說明狀態沒有改變有可能是resolve方法被異步加載,那么會被把傳入的onFulfilled和onRejected方法push到resolveCallbacks和rejectCallbacks隊列當中; 第二種是fulfilled狀態,說明被resolve了,那么就會執行當前的onFulfilled方法 第三種就是rejected狀態,說明被reject了,那么就會執行當前的onRejected方法 5.如果resolve或者reject被異步了,那么就會先通過then將傳入的方法放到callbacks隊列中,等到promise內部resolve或者reject方法執行時,清空callbacks上的方法 6.promise返回的是一個promise對象,promise對象.then返回的仍然是一個promise對象 ```js /** * promise 狀態: * pendding: 初始狀態 pendding 可以轉為 fulfilled和 rejected * fulfilled * rejected */ class Commitment { static PENDING = "待定"; static FULFILLED = "成功"; static REJECTED = "拒絕"; constructor(func) { this.status = Commitment.PENDING; // 一開始為 pendding this.result = null; // 結果 this.resolveCallbacks = []; this.rejectCallbacks = []; // 這里需要bind this,否則new實例過程中立即調用func函數,此時還沒有this // func(this.resolve.bind(this), this.reject.bind(this)) // 傳入后立即執行 try { func(this.resolve.bind(this), this.reject.bind(this)); } catch (error) { // 如果報錯,直接執行 reject this.reject(error); } } // resole和reject是在創建 promise 的過程中調用的 resolve(result) { // result 為 new Promise 時 resolve(result)中的result setTimeout(() => { // resolve 時,如果狀態為 pendding,則改為 fulfilled if (this.status === Commitment.PENDING) { this.status = Commitment.FULFILLED; this.result = result; // 如果是異步,resolve可能會比 then 后執行 // 檢查 callbacks數組并執行 this.resolveCallbacks.forEach((callback) => { callback(result); }); } }); } reject(result) { // reject 的時候,如果狀態為 pendding,則改為 rejected setTimeout(() => { if (this.status === Commitment.PENDING) { this.status = Commitment.REJECTED; this.result = result; this.rejectCallbacks.forEach((callback) => { callback(result); }); } }); } // then 有兩個參數, // onfulfilled:狀態成功時,執行的回調 // onrejected: 狀態為拒絕時,執行的回調 then(onFULFILLED, onREJECTED) { return new Commitment((resolve, reject) => { // 判斷傳入的是否是函數 if (typeof onFULFILLED !== "function") { onFULFILLED = () => {}; } if (typeof onREJECTED !== "function") { onREJECTED = () => {}; } // 如果是 pendding,說明resolve被異步了, // 把 then 應該執行的方法放到 resolveCallbacks中 if (this.status === Commitment.PENDING) { this.resolveCallbacks.push(onFULFILLED); this.rejectCallbacks.push(onREJECTED); } // 如果promise實例執行的是 resolve,則 if (this.status === Commitment.FULFILLED) { setTimeout(() => { onFULFILLED(this.result); }); } // 如果promise實例執行的是 reject,則 if (this.status === Commitment.REJECTED) { setTimeout(() => { onREJECTED(this.result); }); } }); } } let commitment = new Commitment((resolve, reject) => { // resolve實際做了兩件事 // 1.把 promise實例內部的 pedding狀態改為 fulfilled // 2.把 resolve(參數)的參數傳入了promise實例,作為result resolve("resolve的結果"); // 這里會立即執行 resolve方法 // reject() // throw new Error('報錯') }); // commitment.then( // undefined, // res => { // console.log('reject的時候會觸發', res); // } // ) console.log("1"); let commitment2 = new Commitment((resolve, reject) => { // func 會立即執行 console.log("2"); setTimeout(() => { resolve("3"); // 把 resolve 的內容存在 result 中了 reject("4"); console.log(5); }); }); commitment2.then( (result) => { console.log(result, "6"); }, (result) => { console.log(result, "7"); } ); console.log("8"); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看