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