<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        JavaScript異步編程Promise模式的6個(gè)特性_javascript技巧

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:21:25
        文檔

        JavaScript異步編程Promise模式的6個(gè)特性_javascript技巧

        JavaScript異步編程Promise模式的6個(gè)特性_javascript技巧:在我們開始正式介紹之前,我們想看看Javascript Promise的樣子: 代碼如下:var p = new Promise(function(resolve, reject) { resolve(hello world);});p.then(function(str) { alert(str);});1. then()返回
        推薦度:
        導(dǎo)讀JavaScript異步編程Promise模式的6個(gè)特性_javascript技巧:在我們開始正式介紹之前,我們想看看Javascript Promise的樣子: 代碼如下:var p = new Promise(function(resolve, reject) { resolve(hello world);});p.then(function(str) { alert(str);});1. then()返回

        在我們開始正式介紹之前,我們想看看Javascript Promise的樣子:
        代碼如下:
        var p = new Promise(function(resolve, reject) {
        resolve("hello world");
        });

        p.then(function(str) {
        alert(str);
        });
        1. then()返回一個(gè)Forked Promise

        以下兩段代碼有什么區(qū)別呢?

        代碼如下:
        // Exhibit A
        var p = new Promise(/*...*/);
        p.then(func1);
        p.then(func2);

        // Exhibit B
        var p = new Promise(/*...*/);
        p.then(func1)
        .then(func2);
        如果你認(rèn)真以上兩段代碼等同的話,那么Promises只不過是一個(gè)一維的回調(diào)函數(shù)數(shù)組。然而,其實(shí)不是這樣的。每一個(gè)then()調(diào)用都返回一個(gè)forked promise。因此,ExhibitA中,如果func1()拋出一個(gè)異常,func2()仍舊正常調(diào)用。

        在ExhibitB中,如果func1()拋出一個(gè)錯(cuò)誤,fun2()將不會(huì)被調(diào)用,因?yàn)榈谝粋€(gè)調(diào)用返回了一個(gè)新的promise,這個(gè)在func1()中會(huì)被拒絕。結(jié)果是func2()被跳過。

        總結(jié):promises可以被fork成多個(gè)路徑,類似復(fù)雜的流程圖。

        2. Callback應(yīng)該傳遞結(jié)果

        當(dāng)你運(yùn)行下面代碼的時(shí)候什么會(huì)得到警告提示呢?
        代碼如下:
        var p = new Promise(function(resolve, reject) {
        resolve("hello world");
        });

        p.then(function(str) {})
        .then(function(str) {
        alert(str);
        });
        第二個(gè)then()中的alert沒有顯示任何內(nèi)容。這是因?yàn)榛卣{(diào)函數(shù),在promise的上下文中,因?yàn)榻Y(jié)果的變化并沒有回調(diào)函數(shù)。promise期望你的回調(diào)函數(shù)返回同樣的結(jié)果或者返回一個(gè)替換結(jié)果,然后被傳遞到下一個(gè)回調(diào)函數(shù)中。

        類似使用adpater來變化結(jié)果,如下:
        代碼如下:
        var feetToMetres = function(ft) { return ft*12*0.0254 };

        var p = new Promise(/*...*/);

        p.then(feetToMetres)
        .then(function(metres) {
        alert(metres);
        });
        3. 只有來自上一層的異??梢员徊蹲?/P>

        這兩段代碼有什么區(qū)別?
        代碼如下:
        // Exhibit A
        new Promise(function(resolve, reject) {
        resolve("hello world");
        })
        .then(
        function(str) {
        throw new Error("uh oh");
        },
        undefined
        )
        .then(
        undefined,
        function(error) {
        alert(error);
        }
        );

        // Exhibit B
        new Promise(function(resolve, reject) {
        resolve("hello world");
        })
        .then(
        function(str) {
        throw new Error("uh oh");
        },
        function(error) {
        alert(error);
        }
        );
        在第一段代碼中,在第一個(gè)then()中的異常被拋出,將會(huì)被第二個(gè)then()捕捉,然后“uh oh”警告將會(huì)被觸發(fā)。這個(gè)遵循只有前一個(gè)層次的異常會(huì)被捕捉。

        在第二段代碼中,回調(diào)函數(shù)和錯(cuò)誤回調(diào)函數(shù)是同一個(gè)層次,意味著當(dāng)異常在回調(diào)中拋出,將不會(huì)被捕捉。事實(shí)上,第二段代碼的錯(cuò)誤回調(diào)將只會(huì)在promise為拒絕狀態(tài)或者promise本身出錯(cuò)的情況下拋出

        4. 錯(cuò)誤可以被恢復(fù)

        在一個(gè)錯(cuò)誤回調(diào)函數(shù)中,如果你不重新拋出錯(cuò)誤,promise會(huì)假設(shè)你已經(jīng)從錯(cuò)誤中恢復(fù),并且反轉(zhuǎn)成為已解決狀態(tài)。在下一個(gè)例子中,"i'm saved" 將會(huì)被顯示,這是因?yàn)樵诘谝粋€(gè)then()中的錯(cuò)誤回調(diào)沒有重新拋出異常。
        代碼如下:
        var p = new Promise(function(resolve, reject) {
        reject(new Error("pebkac"));
        });

        p.then(
        undefined,
        function(error) { }
        )
        .then(
        function(str) {
        alert("I am saved!");
        },
        function(error) {
        alert("Bad computer!");
        }
        );
        Promise可以被看作洋蔥上的層次。每一個(gè)then()添加另外一個(gè)層次到洋蔥上。每一個(gè)層次代表了一個(gè)被處理的活動(dòng)。當(dāng)層次結(jié)束,結(jié)果被認(rèn)為已經(jīng)修復(fù)并且為下一個(gè)層次做好了準(zhǔn)備。

        5. Promises可以被暫停

        因?yàn)槟阋呀?jīng)準(zhǔn)備好了在一個(gè)then()方法中執(zhí)行,并不意味著你不能夠暫停并且提前運(yùn)行其他。 為了暫停目前的promise,或者讓它等待以便另外一個(gè)promise完成,簡單在then()中返回另外一個(gè)promise。
        代碼如下:
        var p = new Promise(/*...*/);

        p.then(function(str) {
        if(!loggedIn) {
        return new Promise(/*...*/);
        }
        })
        .then(function(str) {
        alert("Done.");
        })
        在前面代碼中,直到新的promise解析后提示才會(huì)出現(xiàn)。這是一個(gè)方便的方式在已存在的異步代碼路徑中來引入更多地依賴。例如,你可能發(fā)現(xiàn)用戶session已經(jīng)timeout,并且你可能希望在繼續(xù)前面的代碼路徑前初始化第二個(gè)登陸。

        6. Resolved Promises并不會(huì)立刻執(zhí)行

        運(yùn)行下面代碼會(huì)得到提示框么?
        代碼如下:
        function runme() {
        var i = 0;

        new Promise(function(resolve) {
        resolve();
        })
        .then(function() {
        i += 2;
        });
        alert(i);
        }
        因?yàn)閜romise被立刻解析,然后then()方法被立刻執(zhí)行,所以你可能會(huì)認(rèn)為會(huì)探出提示2。但是promise定義要求所有的調(diào)用都被強(qiáng)制異步。因此提示會(huì)在被修改前生成。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript異步編程Promise模式的6個(gè)特性_javascript技巧

        JavaScript異步編程Promise模式的6個(gè)特性_javascript技巧:在我們開始正式介紹之前,我們想看看Javascript Promise的樣子: 代碼如下:var p = new Promise(function(resolve, reject) { resolve(hello world);});p.then(function(str) { alert(str);});1. then()返回
        推薦度:
        標(biāo)簽: javascript 6個(gè) 的特性
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 妇女自拍偷自拍亚洲精品| 亚洲色大成网站www永久| 亚洲av日韩精品久久久久久a| 亚洲精品在线免费观看视频| 亚洲AV无码一区二区三区系列 | 成年人视频在线观看免费| 亚洲国产精品综合久久2007| 在免费jizzjizz在线播| 亚洲成电影在线观看青青| 最近2019中文字幕免费看最新| 亚洲视频在线观看2018| 免费看的一级毛片| 狼人大香伊蕉国产WWW亚洲| 亚洲区日韩区无码区| 中文字幕免费在线播放| 亚洲av不卡一区二区三区| 久久午夜羞羞影院免费观看| 亚洲成a人不卡在线观看| 7723日本高清完整版免费| 亚洲精品无码久久久久秋霞| 亚洲av午夜精品一区二区三区| 一级毛片免费毛片毛片| 亚洲精品国偷自产在线| 1000部拍拍拍18免费网站| 亚洲国产欧美日韩精品一区二区三区| 曰皮全部过程视频免费国产30分钟 | 黄视频在线观看免费| 亚洲小视频在线观看| 久久久久国色AV免费看图片| 看成年女人免费午夜视频| 国产成A人亚洲精V品无码| 99久久久精品免费观看国产 | 日韩免费码中文在线观看| 狠狠色伊人亚洲综合成人| 免费做爰猛烈吃奶摸视频在线观看 | 日本a级片免费看| 国产中文字幕在线免费观看| 亚洲精品国产成人| 亚洲高清免费视频| 精品一区二区三区免费毛片爱 | 日韩一级视频免费观看|