<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
        主站蜘蛛池模板: 三年片在线观看免费观看大全一 | 日本高清不卡aⅴ免费网站| rh男男车车的车车免费网站 | 亚洲一区二区三区在线观看蜜桃 | 亚洲精品国产第一综合99久久| 亚洲av无码专区亚洲av不卡| 一个人免费观看www视频| 亚洲精品视频在线观看免费| 国产免费变态视频网址网站| 亚洲av无码国产精品夜色午夜 | 国产精品亚洲不卡一区二区三区 | 亚洲一区二区精品视频| 一级毛片在线播放免费| 国产午夜亚洲精品午夜鲁丝片| 亚洲中文字幕无码av在线| 嫖丰满老熟妇AAAA片免费看| 中文字幕亚洲一区二区三区| 亚洲va在线va天堂va手机| 成人看的午夜免费毛片| 亚洲国产精品特色大片观看完整版| 精品久久久久久久久亚洲偷窥女厕| 久久99国产乱子伦精品免费| 久久久久亚洲AV无码专区网站 | 亚洲成人在线免费观看| 亚洲一区在线视频| 国产免费牲交视频| a国产成人免费视频| 亚洲国产综合第一精品小说| 久久久久久国产精品免费免费男同| 亚洲成a人片在线观看中文app| 免费看又爽又黄禁片视频1000| 亚洲色av性色在线观无码| 国产一区二区三区免费观看在线| 亚洲色成人网一二三区| 亚洲A∨精品一区二区三区| 亚洲AV日韩AV无码污污网站| 亚洲中文字幕无码永久在线| 久久久久久久91精品免费观看| 男人扒开添女人下部免费视频| 四虎影视www四虎免费| 中文字幕 亚洲 有码 在线|