為什么要使用promise

起因

大家都知道做前端開發(fā)的時候最讓人頭痛的就是處理異步請求的情況,在請求到的成功回調(diào)函數(shù)里繼續(xù)寫函數(shù),長此以往形成了回調(diào)地獄。

function load() {
    $.ajax({
        url: 'xxx.com',
        data: 'jsonp',
        success: function(res) {
            init(res, function(res) {
                render(res, function(res) {
                    // 一層一層又一層
                });
            });
        }
    }
}

load();


這樣的代碼看層級少了當(dāng)然還是可以湊合看的,但是多起來的話,那就難以維護(hù)了,無論是開發(fā)者自身還是同事來接手項(xiàng)目,都是極其無奈的!還要我怎樣,要怎樣,怎樣,樣。

于是乎 出現(xiàn)了Promise

當(dāng)年在聽到關(guān)于Promise的報道的時候沒有太多關(guān)注,只是知道是解決回調(diào)地獄問題的,一種異步請求解決方案而已。
后來在工作當(dāng)中發(fā)現(xiàn)JQ也實(shí)現(xiàn)了相關(guān)的方法,上代碼

$.get('xxx.php').done(function() {
    alert('成功的回調(diào)');    // 相當(dāng)于Promise的resolve()
});

現(xiàn)在看來,真的和Promise差不多呢。那么我們回到今天的主角來
先介紹一下Promise的三種狀態(tài):

  • Pending 創(chuàng)建Promise對象時的初始狀態(tài)
  • Fulfilled 成功時的狀態(tài)
  • Rejected 失敗時的狀態(tài)

說完了狀態(tài)直接上代碼,我們得會用才行:
還以上面load函數(shù)的例子

  // then方法是用的最多的了
  // 按照then來執(zhí)行成功和失敗的回調(diào)函數(shù)
  function load() {
    return new Promise((resovel, reject) => {
        $.ajax({
            url: 'xxx.com',
            data: 'jsonp',
            success: function(res) {
                resolve(res);
            },
            error: function(err) {
                reject(err);
            }
        });
    });
}

// 用一下
load().then(data => {
    console.log(data);  // 請求到的數(shù)據(jù)
    console.log('請求數(shù)據(jù)成功');
}, err => {
    console.log('請求失敗');
});

除了處理請求,Promise還可以寫在普通的函數(shù)中

function init(options) {
    return new Promise((resolve, reject) => {
        if (options.id) {
            console.log('你是唯一')
            resolve(options.id);
        } else {
            console.log('不行,不行');
            reject()
        }
    });
}

init({id: 110})
    .then(id => {
        console.log(id);          // 110
        let obj = {id, nickname: '左夕'};
        return obj;
    })
    .then(other => {
        console.log(other);    // { id: 110, nickname: '左夕' }
    });


Promise.all和Promise.race有點(diǎn)類型
all是Promise的狀態(tài)都為成功才表示成功
race是Promise的狀態(tài)是有一個先成功的狀態(tài)了,就表示成功
最近很火的axios其實(shí)就是調(diào)用了Promise,寫法也是很相似的
由于它是第三方包,需要npm i axios安裝一下

// 發(fā)個get請求
axios.get('user/', {
    id,
    username
}).then(res => {
    console.log(res);   // 成功
}).catch(err => {
    console.log(err);   // 失敗
});

// 再來個post請求
axios.post('login/', {
    username,
    password
}).then(res => {
    console.log(res);   // 成功
}).catch(err => {
    console.log(err);   // 失敗
});

// 也有all的操作
function getUser() {
    return axios.get('/user');
}

function sendMsg() {
    return axios.post('/info', {msg});
}

axios.all([getUser(), sendMsg()]).then(res => {})


總結(jié)一下:Promise常用的就是這些了,then返回的也是一個Promise對象,所以可以繼續(xù)調(diào)用.then方法。有說的不對的地方,還望指出。

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

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

  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,836評論 1 56
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 8,780評論 0 29
  • 你不知道JS:異步 第三章:Promises 接上篇3-1 錯誤處理(Error Handling) 在異步編程中...
    purple_force閱讀 1,498評論 0 2
  • 一、Promise的含義 Promise在JavaScript語言中早有實(shí)現(xiàn),ES6將其寫進(jìn)了語言標(biāo)準(zhǔn),統(tǒng)一了用法...
    Alex灌湯貓閱讀 888評論 0 2
  • 你不知道JS:異步 第三章:Promises 在第二章,我們指出了采用回調(diào)來表達(dá)異步和管理并發(fā)時的兩種主要不足:缺...
    purple_force閱讀 2,252評論 0 4

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