關於promise的學習和拓展

Promise的學習和拓展


以前開發的時候偶爾會在請求中,或者其他場景中用到promise,只知道它是什麼(鏈式調用,用於請求的後返回值得操作之類的),大概怎麼用,卻沒有深入瞭解。

起因:(在參考了廖雪峯的promise講解後https://www.liaoxuefeng.com/w...

在javascript中,所有的代碼都是單線程進行的。
由於這個“缺陷”,導致JavaScript的所有網絡操作,瀏覽器事件,都必須是異步執行。異步執行可以用回調函數實現(否者在加載完js文件後。其他操作也不會發生了):

參數:executor是帶有 resolve 和 reject 兩個參數的函數 。Promise構造函數執行時立即調用executor 函數, resolve 和 reject 兩個函數作爲參數傳遞給executor(executor 函數在Promise構造函數返回所建promise實例對象前被調用)。resolve 和 reject 函數被調用時,分別將promise的狀態改爲fulfilled(完成)或rejected(失敗)。executor 內部通常會執行一些異步操作,一旦異步操作執行完畢(可能成功/失敗),要麼調用resolve函數來將promise狀態改成fulfilled,要麼調用reject 函數將promise的狀態改爲rejected。如果在executor函數中拋出一個錯誤,那麼該promise 狀態爲rejected。

由此可以知道,一個promise包含3個狀態:(注意,不包含resolve
)
pending: 初始狀態,既不是成功,也不是失敗狀態。
fulfilled: 意味着操作成功完成。
rejected: 意味着操作失敗。
function callback() {
    console.log('Done');
}
console.log('before setTimeout()');
setTimeout(callback, 0); // 1秒鐘後調用callback函數
console.log('after setTimeout()');

觀察上述代碼執行,在Chrome的控制檯輸出可以看到:

before setTimeout()
after setTimeout()
Done
AJAX就是典型的異步操作
var ajax = ajaxGet('http://...');
ajax.ifSuccess(success)
    .ifFail(fail);
統一執行AJAX邏輯,不關心如何處理結果,然後,根據結果是成功還是失敗,在將來的某個時候調用success函數或fail函數。
這個時候promise方法就應運而生了。

一個簡單的promise應用
生成一個0-2之間的隨機數,如果小於1,則等待一段時間後返回成功,否則返回失敗:
function test(resolve, reject) {
    var timeOut = Math.random() * 2;
    log('set timeout to: ' + timeOut + ' seconds.');
    setTimeout(function () {
        if (timeOut < 1) {
            log('call resolve()...');
            resolve('200 OK');
        }
        else {
            log('call reject()...');
            reject('timeout in ' + timeOut + ' seconds.');
        }
    }, timeOut * 1000);
}

有了執行函數,我們就可以用一個Promise對象來執行它,並在將來某個時刻獲得成功或失敗的結果:

var p1 = new Promise(test);
var p2 = p1.then(function (result) {
    console.log('成功:' + result);
});
var p3 = p2.catch(function (reason) {
    console.log('失敗:' + reason);
});

也可以寫成鏈式調用的形式

new Promise(test).then(function (result) {
    console.log('成功:' + result);
}).catch(function (reason) {
    console.log('失敗:' + reason);
});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章