摘要:秒鐘后調(diào)用函數(shù)觀察上述代碼執(zhí)行,在的控制臺輸出可以看到就是典型的異步操作統(tǒng)一執(zhí)行邏輯,不關(guān)心如何處理結(jié)果,然后,根據(jù)結(jié)果是成功還是失敗,在將來的某個時候調(diào)用函數(shù)或函數(shù)。
Promise的學(xué)習(xí)和拓展
以前開發(fā)的時候偶爾會在請求中,或者其他場景中用到promise,只知道它是什么(鏈?zhǔn)秸{(diào)用,用于請求的后返回值得操作之類的),大概怎么用,卻沒有深入了解。
起因:(在參考了廖雪峰的promise講解后https://www.liaoxuefeng.com/w...)
在javascript中,所有的代碼都是單線程進(jìn)行的。
由于這個“缺陷”,導(dǎo)致JavaScript的所有網(wǎng)絡(luò)操作,瀏覽器事件,都必須是異步執(zhí)行。異步執(zhí)行可以用回調(diào)函數(shù)實現(xiàn)(否者在加載完js文件后。其他操作也不會發(fā)生了):參數(shù):executor是帶有 resolve 和 reject 兩個參數(shù)的函數(shù) 。Promise構(gòu)造函數(shù)執(zhí)行時立即調(diào)用executor 函數(shù), resolve 和 reject 兩個函數(shù)作為參數(shù)傳遞給executor(executor 函數(shù)在Promise構(gòu)造函數(shù)返回所建promise實例對象前被調(diào)用)。resolve 和 reject 函數(shù)被調(diào)用時,分別將promise的狀態(tài)改為fulfilled(完成)或rejected(失敗)。executor 內(nèi)部通常會執(zhí)行一些異步操作,一旦異步操作執(zhí)行完畢(可能成功/失敗),要么調(diào)用resolve函數(shù)來將promise狀態(tài)改成fulfilled,要么調(diào)用reject 函數(shù)將promise的狀態(tài)改為rejected。如果在executor函數(shù)中拋出一個錯誤,那么該promise 狀態(tài)為rejected。
由此可以知道,一個promise包含3個狀態(tài):(注意,不包含resolve
)
pending: 初始狀態(tài),既不是成功,也不是失敗狀態(tài)。
fulfilled: 意味著操作成功完成。
rejected: 意味著操作失敗。
function callback() { console.log("Done"); } console.log("before setTimeout()"); setTimeout(callback, 0); // 1秒鐘后調(diào)用callback函數(shù) console.log("after setTimeout()");
觀察上述代碼執(zhí)行,在Chrome的控制臺輸出可以看到:
before setTimeout() after setTimeout() Done
AJAX就是典型的異步操作
var ajax = ajaxGet("http://..."); ajax.ifSuccess(success) .ifFail(fail);
統(tǒng)一執(zhí)行AJAX邏輯,不關(guān)心如何處理結(jié)果,然后,根據(jù)結(jié)果是成功還是失敗,在將來的某個時候調(diào)用success函數(shù)或fail函數(shù)。
這個時候promise方法就應(yīng)運而生了。
一個簡單的promise應(yīng)用
生成一個0-2之間的隨機數(shù),如果小于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); }
有了執(zhí)行函數(shù),我們就可以用一個Promise對象來執(zhí)行它,并在將來某個時刻獲得成功或失敗的結(jié)果:
var p1 = new Promise(test); var p2 = p1.then(function (result) { console.log("成功:" + result); }); var p3 = p2.catch(function (reason) { console.log("失敗:" + reason); });
也可以寫成鏈?zhǔn)秸{(diào)用的形式
new Promise(test).then(function (result) { console.log("成功:" + result); }).catch(function (reason) { console.log("失敗:" + reason); });
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/104295.html
摘要:目前的標(biāo)準(zhǔn)化工作正在進(jìn)行中,預(yù)計會在年月份放出正式敲定的版本。反的方法可以接收一個參數(shù)并且返回值取決與它的構(gòu)造函數(shù)。之后就可以用這個返回值做為對象的鍵了。 本文基于lukehoban/es6features ,同時參考了大量博客資料,具體見文末引用。 ES6(ECMAScript 6)是即將到來的新版本JavaScript語言的標(biāo)準(zhǔn),代號harmony(和諧之意,顯然沒有跟上我國的步伐...
摘要:因為路由層面受業(yè)務(wù)影響很大,經(jīng)常修改一些功能的行為,所以后來大部分測試都是針對層面的單元測試。在我了解的過程中,我發(fā)現(xiàn)中文網(wǎng)絡(luò)上對的討論非常分散,于是我創(chuàng)建了中文社區(qū),到年末已經(jīng)有個注冊用戶和個帖子了。 https://jysperm.me/2016/02/programming-of-2015/ 從 2014 年末開始開發(fā)的一個互聯(lián)網(wǎng)金融項目終于在今年三月份上線了,這是一個 Node...
摘要:因為路由層面受業(yè)務(wù)影響很大,經(jīng)常修改一些功能的行為,所以后來大部分測試都是針對層面的單元測試。在我了解的過程中,我發(fā)現(xiàn)中文網(wǎng)絡(luò)上對的討論非常分散,于是我創(chuàng)建了中文社區(qū),到年末已經(jīng)有個注冊用戶和個帖子了。 https://jysperm.me/2016/02/programming-of-2015/ 從 2014 年末開始開發(fā)的一個互聯(lián)網(wǎng)金融項目終于在今年三月份上線了,這是一個 Node...
閱讀 2577·2021-10-25 09:45
閱讀 1239·2021-10-14 09:43
閱讀 2297·2021-09-22 15:23
閱讀 1519·2021-09-22 14:58
閱讀 1934·2019-08-30 15:54
閱讀 3539·2019-08-30 13:00
閱讀 1354·2019-08-29 18:44
閱讀 1571·2019-08-29 16:59