Promise 與異步編程

個人博客遷移到biubu.cn,此處停更.請移步。

  • 1. 異步編程的背景知識

    • Javascript 引擎是基于單線程事件循環(huán)的概念構(gòu)建的,同一時刻只允許一個代碼塊在執(zhí)行。
    • 那些代碼被放在一個任務隊列,每當一段代碼準備執(zhí)行時,都會被添加到任務隊列。每當javascript引擎中的一段代碼結(jié)束執(zhí)行,事件循環(huán)會執(zhí)行隊列中的下一個任務,任務隊列是javascript引擎中的一段程序,負責監(jiān)控代碼執(zhí)行并管理任務隊列。
    • 隊列中的任務會從第一個一直執(zhí)行到最后一個。
  • 1.1 JS引擎相關(guān)

    • jS引擎的主線程負責執(zhí)行代碼,由于只有這一個線程,執(zhí)行當然是同步的,即按照順序來。另外,還有一個叫做任務隊列的東西,所有的異步代碼都是從隊列當中來。
JS引擎工作流程
  • 在JS中,所謂的異步任務,有三種:
    • 第一 鼠標鍵盤事件觸發(fā),例如onclick、onkeydown等等
    • 第二 網(wǎng)絡事件觸發(fā),例如onload、onerror等等
    • 第三 定時器,例如setTimeout、setInterval

2. Promise的基礎知識

2.1 Promise生命周期

graph TD
A[padding] --> B[Fulfilled]
A[padding] --> C[Rejected]
  • 每個 Promise 都會經(jīng)歷一個生命周期,先是處于 進行中(pedding) 的狀態(tài),此時操作尚未完成,所以它也是 未處理(unsettled);一旦異步操作之行結(jié)束,Promise則變?yōu)?已處理(settled)的狀態(tài)。
    操作結(jié)束后,Promise可能會進入到以下兩個狀態(tài)中的其中一個。
    • Fulfilled Promise 異步操作成功完成。
    • Rejected 由于程序錯誤或一些其他原因,Promise 異步操作未能成功完成。
  • 所有 Promise 都有 then() 方法,它接受兩個參數(shù):第一個是當Promise狀態(tài)變?yōu)閒ulfilled 時要調(diào)用的函數(shù),與異步相關(guān)的附加數(shù)據(jù)都會傳遞給這個完成函數(shù);第二個是當 Promise 的狀態(tài)變?yōu)?rejected 時要調(diào)用的函數(shù),所有失敗狀態(tài)相關(guān)的附加參數(shù)都會傳遞給這個拒絕函數(shù)。以下是用 Promise封裝的 ajax :
let ajaxPromise = (url, params) => {
    // 判斷 params 是否存在
    if(params) {
        url = url + '?' + params;
    }
    return new Promise ((resolve, reject) => {
        let ajax = null;
        if(window.XMLHttpRequest) {
            ajax = new XMLHttpRequest ();
        }
        else {
            ajax = new ActiveXObject ('Microsoft.XMLHTTP ');
        }
        ajax.open ('GET', url);
        ajax.send ();
        ajax.onreadystatechange = () => {
            if(ajax.readyState == 4 && ajax.status == 200) {
                resolve (ajax.responseText);
            }
        };
        // 如果 3秒內(nèi)請求未完成,則調(diào)用 失敗函數(shù)
        setTimeout (() => {
            reject ();
        }, 3000);
     
    });
};
let url = 'http://192.168.2.220:8080';
let params = 'name=wangjq&handsome=true';
ajaxPromise(url,params).then(result=>{
    console.log (result.data);
},reason => {
    console.log (reason.message);
})

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 【同讀一本書·秦圓圓】 ――――《內(nèi)心強大,誰都傷不了你》 ――――2016―9―7 原文:這樣的我,像不倒翁一樣...
    秦圓圓閱讀 1,455評論 1 1
  • “你真是一個瘋子?!?“是的,沒錯。”于是我又離家出走了。其實從宿舍出走根本算不上離家。所以每次與人分開他跟我說,...
    43282d79ce63閱讀 310評論 3 2
  • 總會在想,是不是我足夠優(yōu)秀了,你就會愛我了?你總說,我最好,可還是選擇了她。真是世間一大笑話!呵呵,是自己太傻罷了。
    蛙精閱讀 329評論 0 2
  • 在閱讀stellar_wifi源代碼的時候,我發(fā)現(xiàn)ByteBuffer這個類使用的很頻繁。就打算對這個類進行一下學...
    jackLee閱讀 6,341評論 2 2

友情鏈接更多精彩內(nèi)容