成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

嗨,了解一下,我的Promise學(xué)習筆記

yanest / 2852人閱讀

摘要:回調(diào)函數(shù)成功回調(diào)處理器失敗回調(diào)處理器用戶發(fā)送一個向百度服務(wù)器獲取數(shù)據(jù)的異步請求無阻塞高并發(fā)的的誕生更加嚴重的依賴異步操作才能完成無阻賽高并發(fā)的特性。

Promise Promise 是什么? 詞語本意:
發(fā)音:[?pr?m?s]
詞性:名詞,
翻譯:許諾,允諾。
MDN解釋

Promise 對象用于一個異步操作。

一個Promise表示一個現(xiàn)在,將來或永不可能可用的值。

按照書寫方式來解釋

可以將異步操作的書寫方式變成一種隊列化的書寫方式,并按照我們寫的那樣的預(yù)期來執(zhí)行返回符合預(yù)期的結(jié)果。

為什么需要Promise

js為檢查表單而生,其首要目標是操作dom,界面凍結(jié)會造成非常不友好的用戶體驗,所以dom操作大多是異步的。
注意:同步操作的處理器未執(zhí)行完成會使得界面無法響應(yīng)用戶的其他操作,而異步操作則可以避免該問題。
常見的異步操作語法:

1. 異步事件
$("#start").on("click",startHandler);
function startHandler(){} // 定義事件響應(yīng)的處理器函數(shù)

用戶點擊start元素就會觸發(fā)一個異步事件去執(zhí)行,再次觸發(fā)不必等待前一次事件執(zhí)行完成,就可以再次觸發(fā)。

2. 回調(diào)函數(shù)
$.ajax("http://baidu.com",{
    success:function(res){
    // 成功回調(diào)處理器
    },
    error:function(e){
    // 失敗回調(diào)處理器
    }
});

用戶發(fā)送一個向百度服務(wù)器獲取數(shù)據(jù)的異步請求

3. 無阻塞高并發(fā)的node的誕生

更加嚴重的依賴異步操作才能完成無阻賽高并發(fā)的特性。

然而異步回調(diào)這種方式并不是理想的,它卻有一些問題,
比如:

回調(diào)地獄這種難于維護的書寫方式。

更深層次的問題:

嵌套回調(diào)中的循環(huán)語句出錯后,無法正常的使用return和throw終止

無法正常檢索堆棧信息(每一個回調(diào)都會重新建立堆棧)

多個回調(diào)之間難以建立聯(lián)系

Promise詳解

一個promise的基本使用案例:

new Promise(
    // 執(zhí)行器 executor
    function ( resolve, reject ) {
        //一段耗時很長的異步操作
        resolve(); //異步處理成功
        reject(); // 異步處理失敗 
        //注意:resolve和reject這倆個回調(diào)函數(shù)被調(diào)用是互斥的  
    }
).then( function A(){
            //成功,下一步
    }, 
    function B(){
        //失敗,做善后處理
    } 
);

promise是一個代理對象,它和原先要進行的操作并無關(guān)系。

它通過引入一個回調(diào),避免更多的回調(diào)。

promise有三個狀態(tài):

pending 初始狀態(tài) fulfilled 操作成功 rejectd 操作失敗

promise一經(jīng)創(chuàng)建,執(zhí)行器便會立刻執(zhí)行;

異步操作通過調(diào)用resolve改變promise狀態(tài)為fulfilled,通過調(diào)用reject改變promise狀態(tài)為rejected;

promise狀態(tài)發(fā)生改變就會觸發(fā)then里面的響應(yīng)函數(shù);

promise狀態(tài)一經(jīng)改變,不會再變。

promise最簡單的實現(xiàn):
//范例1
console.log("here we go");
new Promise( resolve => {
    setTimeout( () => {
        resolve("hello");
    }, 2000);
}).then( value => {
    console.log( value + " world");
});
/* 控制臺日志 */ 
here we go
// 2s以后
hello world
// 范例2
console.log("here we go");
new Promise(resolve => {
    setTimeout( () => {
        resolve("hello");
    }, 2000);
}).then(value => {
    console.log(value);
    return new Promise( resolve => {
        setTimeout(() => {
            resolve("world");
        }, 2000);
    });
}).then(value => {
    console.log( value + " world");
});
/* 控制臺日志 */
here we go
// 2s后
hello
// 2s后
world world

// 假如一個Promise已經(jīng)完成了,再.then()會怎樣?

console.log("start");
let promise = new Promise(resolve => {
    setTimeout(() => {
        console.log("the promise fulfilled");
        resolve("hello, world");
    }, 1000);
});
setTimeout(() => {
    promise.then( value => {
        console.log(value);
    });
}, 3000);
/* 控制臺 */
17:37:29.015 start
17:37:30.016 the promise fulfilled
17:37:32.017 hello, world

// 假如在.then()的函數(shù)里面不返回新的Promise,會怎樣?

console.log("here we go");
new Promise(resolve => {
    setTimeout( () => {
        resolve("hello");
    }, 2000);
}).then( value => {
    console.log(value);
    console.log("everyone");
    (function () {
        return new Promise(resolve => {
            setTimeout(() => {
                console.log("Mr.Laurence");
                resolve("Merry Xmas");
            }, 2000);
        });
    }());
//     return false;
}).then( value => {
    console.log(value + " world"); return 0
}).then( value => {
    console.log(value + " world");
}).then( value => {
    console.log(value + " world");
});
/* 控制臺 */
17:53:03.175 here we go
17:53:03.191 Promise?{}
17:53:05.181 hello
17:53:05.181 everyone
17:53:05.181 undefined world
17:53:05.182 0 world
17:53:05.182 undefined world
17:53:07.187 Mr.Laurence
從日志可以看出,
1. 執(zhí)行器中必須回調(diào)resolve或者reject改變promise的狀態(tài);
2. 當狀態(tài)改變后繼續(xù)調(diào)用then方法,但是promise中的狀態(tài)已經(jīng)無法改變了;
3. 可以看到promise對象幫我們生成了一個隊列,這個隊列一直存在。
then方法

then() 接受倆個狀態(tài)響應(yīng)函數(shù)參數(shù),分別代表fulfilled和rejected

then() 返回一個新的Promise實例,所以它可以鏈式調(diào)用

狀態(tài)響應(yīng)函數(shù)可以返回新的Promise,其他值,或者不返回值

如果返回新的Promise,那么下一級.then()會在新的promise狀態(tài)改變之后執(zhí)行

如果返回其它任何值,則會立刻執(zhí)行下一級.then()

then里面有then的情況
1). 因為.then()返回的還是Promise實例。
2). 會等里面的.then()執(zhí)行完,在執(zhí)行外面的。
3). 對我們來說,此時最好將其展開,會更好閱讀。

測試
問題:下面四種Promise的區(qū)別是什么?

前提:doSomething方法和doSomethingElse方法均返回一個promise實例。
// #1
doSomething().then(function() {
    return doSomethingElse();
});
// #2
doSomething().then(function(){
    doSomethingElse();
});
// #3
doSomething().then(doSomethingElse());
// #4
doSomething().then(doSomethingElse);
// 解析:
// #1
doSomething().then(function() {
    return doSomethingElse();
});
//符合預(yù)期的,可以繼續(xù)回調(diào)then方法獲取doSomethingElse的結(jié)果
// #2
doSomething().then(function(){
    doSomethingElse();
});
//then中沒有返回promise,所以之后的then無法獲取到doSomethingElse的結(jié)果,并且與doSomethingElse幾乎同時執(zhí)行
// #3
doSomething().then(doSomethingElse());
// then應(yīng)該接收一個狀態(tài)處理函數(shù),當前這種情況傳入了一個promise實例,無法獲取上層promise的結(jié)果,而該層then會被忽略,下一層會獲取到doSomething()的結(jié)果
// #4
doSomething().then(doSomethingElse);
// then方法中吧doSomethingElse直接當成狀態(tài)處理函數(shù)也是可以達到預(yù)期的
錯誤處理 catch方法

catch和then一樣會返回一個promise實例。如果沒有拋出錯誤,該實例默認也會返回fulfilled狀態(tài)。

Promise 常用函數(shù)

promise.all
接收一個數(shù)組參數(shù),返回一個新的promise實例,響應(yīng)函數(shù)中的結(jié)果為數(shù)組中的每個promise的結(jié)果。
與map連用
使用forEach和reduce實現(xiàn)隊列
ES2017 的async/await

該學(xué)習筆記是學(xué)習慕課網(wǎng)中 Promise入門 記錄

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94295.html

相關(guān)文章

  • 愛奇藝小程序陪你一夏

    摘要:只要滑動了就會觸發(fā),并且有一個代表當時滑動到第幾個??赡苡幸稽c笨笨的。 前言 在炎熱的夏天里最美滋滋的事情是什么呢,我覺得當然是宅在家里,吹著空調(diào),吃著零食看電視劇電影里的帥氣小哥哥、漂亮小姐姐了!在閑暇時光我會經(jīng)常用愛奇藝小程序看視頻,加上現(xiàn)在已經(jīng)學(xué)習了一段時間小程序了,啪,動手模仿一個愛奇藝視頻小程序的念頭就產(chǎn)生了。雖然現(xiàn)在還是個小白,但是希望在這趟愛奇藝小程序之旅上為各位乘客朋友...

    edagarli 評論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個最重要的技術(shù)點常用整理網(wǎng)頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實現(xiàn)的大排序算法一怪對象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術(shù)點 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...

    jsbintask 評論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個最重要的技術(shù)點常用整理網(wǎng)頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實現(xiàn)的大排序算法一怪對象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術(shù)點 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...

    muddyway 評論0 收藏0
  • JS筆記

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識之 HTTP 協(xié)議 詳細介紹 HTT...

    rottengeek 評論0 收藏0

發(fā)表評論

0條評論

yanest

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<