国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

《JavaScript Promise迷你書》讀書筆記

Aldous / 1893人閱讀

摘要:定義是抽象異步處理對象以及對其進行各種操作的組件簡言之,使用就是將中異步的方式變換成同步來操作。如果對異步回調函數進行同步調用的話,處理順序可能會與預期不符,可能帶來意料之外的后果。如果想在將來某時刻調用異步回調函數的話,可以使用等異步。

promise定義

Promise是抽象異步處理對象以及對其進行各種操作的組件

簡言之,使用Promise就是將javascript中異步的方式變換成同步來操作。Promise則是把類似的異步處理對象和處理規則進行規范化, 并按照采用統一的接口來編寫,規定方法之外的寫法都會報錯。簡單的示例:

    var promise = getAsyncPromise("fileA.txt"); //處于Pending狀態,既不是resolve也不是reject的狀態。是promise對象剛被創建后的初始化狀態
    promise.then(function(result){
        // 獲取文件內容成功時的處理 成功時狀態為onFulfilled
    }).catch(function(error){
        // 獲取文件內容失敗時的處理 失敗時狀態為onRejected
    });

其中,thencatch代表函數執行成功和失敗的預設操作

構建promise對象,使用new關鍵字
    var promise = new Promise(function(resolve, reject) {
        // 異步處理
        // 處理結束后、調用resolve 或 reject
    });
對象方法 then
    promise.then(onFulfilled, onRejected); //onFulfilled函數會在promise對象的revolve狀態調用,onRejected為在promise對象reject狀態下調用
    promise.catch(function());//catch用來代替onRejected拋出錯誤 
promise對象中內置部分靜態方法

Promise.all() Promise.racePromise.resolve(),Promise.reject

創建XHR的promise對象
function getURL(URL) {
return new Promise(function (resolve, reject) {
    var req = new XMLHttpRequest();
    req.open("GET", URL, true);
    req.onload = function () {
        if (req.status === 200) {
            resolve(req.responseText);//傳入resolve中的參數會在狀態改變的時候,傳到then中
        } else {
            reject(new Error(req.statusText));
        }
    };
    req.onerror = function () {
        reject(new Error(req.statusText));
    };
    req.send();
});
}
// 運行示例
var URL = "http://httpbin.org/get";
getURL(URL).then(function onFulfilled(value){
console.log(value);
}).catch(function onRejected(error){
console.error(error);
});
Promise.resolve

作用1. Promise.resolve 是 new Promise(func)的快捷方式,如Promise.resolve(42);new Promise(function(resolve){ resolve(42);});
作用2. 將thenable 對象轉換為promise對象。thenable指的是一個具有 .then方法的對象。

Promise.reject
Promise.reject(new Error("出錯了"))

等價于

new Promise(function(resolve,reject){
    reject(new Error("出錯了"));
});

使用

Promise.reject(new Error("BOOM!")).catch(function(error){
    console.error(error);
});
promise對象立刻進入resolve狀態
var promise = new Promise(function (resolve){
    console.log("inner promise"); // 1
    resolve(42);
});
promise.then(function(value){
    console.log(value); // 3
});
console.log("outer promise"); // 2

輸出結果為 1,2,3; 即使resolve立即執行,得出的結果也在下一個時間環里,需要等到下一周期才能執行

1.絕對不能對異步回調函數(即使在數據已經就緒)進行同步調用。
2.如果對異步回調函數進行同步調用的話,處理順序可能會與預期不符,可能帶來意料之外的后果。
3.對異步回調函數進行同步調用,還可能導致棧溢出或異常處理錯亂等問題。
4.如果想在將來某時刻調用異步回調函數的話,可以使用 setTimeout 等異步API。

對比三段代碼:

第一段:直接判斷文件是否加載完成

function onReady(fn) {
    var readyState = document.readyState;
    if (readyState === "interactive" || readyState === "complete") {
        fn();
    } else {
        window.addEventListener("DOMContentLoaded", fn);
    }
}
onReady(function () {
    console.log("DOM fully loaded and parsed");
});
console.log("==Starting==");

第二段:使用setTimeout轉同步為異步操作

function onReady(fn) {
    var readyState = document.readyState;
    if (readyState === "interactive" || readyState === "complete") {
        setTimeout(fn, 0); //使用setTimeout轉化同步函數為異步函數
    } else {
        window.addEventListener("DOMContentLoaded", fn);
    }
}
onReady(function () {
    console.log("DOM fully loaded and parsed");
});
console.log("==Starting==");

第三段:使用promise的resolve將統一為異步的方式,減少判斷

    function onReadyPromise() {
    return new Promise(function (resolve, reject) {
        var readyState = document.readyState;
        if (readyState === "interactive" || readyState === "complete") {
            resolve();
        } else {
            window.addEventListener("DOMContentLoaded", resolve);
        }
    });
}
onReadyPromise().then(function () {
    console.log("DOM fully loaded and parsed");
});
console.log("==Starting==");

關于傳遞參數promise的寫法

function doubleUp(value) {
    return value * 2;
}
function increment(value) {
    return value + 1;
}
function output(value) {
    console.log(value);// => (1 + 1) * 2
}

var promise = Promise.resolve(1);//構造一個返回參數為1的promise對象
promise
    .then(increment) //此時increment函數中傳的vaule值為1
    .then(doubleUp) //此時doubleUp函數中傳的vaule值為2
    .then(output) //此時doubleUp函數中傳的vaule值為 4
    .catch(function(error){
        // promise chain中出現異常的時候會被調用
        console.error(error);
    });

Promise.resolvePromise.reject會對函數中return返回的值進行包裝,最終then返回的結果都是新創建的promise對象

Promise.all的使用

function getURL(URL) {
    return new Promise(function (resolve, reject) {
        var req = new XMLHttpRequest();
        req.open("GET", URL, true);
        req.onload = function () {
            if (req.status === 200) {
                resolve(req.responseText);
            } else {
                reject(new Error(req.statusText));
            }
        };
        req.onerror = function () {
            reject(new Error(req.statusText));
        };
        req.send();
    });
}
var request = {
        comment: function getComment() {
            return getURL("http://azu.github.io/promises-book/json/comment.json").then(JSON.parse);
        },
        people: function getPeople() {
            return getURL("http://azu.github.io/promises-book/json/people.json").then(JSON.parse);
        }
    };
function main() {
    return Promise.all([request.comment(), request.people()]);
}
// 運行示例
main().then(function (value) {
    console.log(value);
}).catch(function(error){
    console.log(error);
});

證明Promise.all的promise數組是同時開始執行的

// `delay`毫秒后執行resolve
function timerPromisefy(delay) {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve(delay);
        }, delay);
    });
}
var startDate = Date.now();
// 所有promise變為resolve后程序退出
Promise.all([
    timerPromisefy(1),
    timerPromisefy(32),
    timerPromisefy(64),
    timerPromisefy(128)
]).then(function (values) {
    console.log(Date.now() - startDate + "ms");
    // 約128ms
    console.log(values);    // [1,32,64,128]
});

Promise.race 只要有一個promise對象進入 FulFilled 或者 Rejected 狀態的話,就會繼續進行后面的處理

// `delay`毫秒后執行resolve
function timerPromisefy(delay) {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve(delay);
        }, delay);
    });
}
// 任何一個promise變為resolve或reject 的話程序就停止運行
Promise.race([
    timerPromisefy(1),
    timerPromisefy(32),
    timerPromisefy(64),
    timerPromisefy(128)
]).then(function (value) {
    console.log(value);    // => 1
});


//代碼第二段 
var winnerPromise = new Promise(function (resolve) {
        setTimeout(function () {
            console.log("this is winner");
            resolve("this is winner");
        }, 4);
    });
var loserPromise = new Promise(function (resolve) {
        setTimeout(function () {
            console.log("this is loser");
            resolve("this is loser");
        }, 1000);
    });
// 第一個promise變為resolve后程序停止
Promise.race([winnerPromise, loserPromise]).then(function (value) {
    console.log(value);    // => "this is winner"
});

不能進行錯誤處理的onRejected

function throwError(value) {
    // 拋出異常
    throw new Error(value);
}
// <1> onRejected不會被調用
function badMain(onRejected) {
    return Promise.resolve(42).then(throwError, onRejected);
}
// <2> 有異常發生時onRejected會被調用
function goodMain(onRejected) {
    return Promise.resolve(42).then(throwError).catch(onRejected);
}
// 運行示例
badMain(function(){
    console.log("BAD");
});
goodMain(function(){
    console.log("GOOD");
});

說明:上面代碼中<1>中throwError 拋出了異常,onRejected 指定的函數也不會被調用

.then 和 .catch 都會創建并返回一個 新的 promise對象。 Promise實際上每次在方法鏈中增加一次處理的時候所操作的都不是完全相同的promise對象。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78607.html

相關文章

  • JS筆記

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

    rottengeek 評論0 收藏0
  • javascript正則迷你-筆記

    showImg(https://segmentfault.com/img/bVbfGSV?w=719&h=718); showImg(https://segmentfault.com/img/bVbfGTc?w=801&h=552); showImg(https://segmentfault.com/img/bVbfGTq?w=1017&h=501);

    LinkedME2016 評論0 收藏0
  • JavaScript正則表達式迷你-筆記

    摘要:比如正則表示匹配這樣一個字符串第一個字符是,接下來是到個字符,最后是字符。其實現的方式是使用字符組。具體形式如下,其中和是子模式,用管道符分隔,表示其中任何之一。 貪婪模式: 在使用修飾匹配次數的特殊符號時,有幾種表示方法可以使同一個表達式能夠匹配不同的次數,比如:{m,n}, {m,}, ?, *, +,具體匹配的次數隨被匹配的字符串而定。這種重復匹配不定次數的表達式在匹配過程中,總...

    widuu 評論0 收藏0
  • 筆記】你不知道的JS讀筆記——Promise

    摘要:寫在前面這一章的順序對于未接觸過使用過的童鞋而言略抽象了,前邊幾章主要為了說明和之前的異步方式相比有什么優勢和它能解決什么問題,后邊才詳解的設計和各種場景下如何使用。建議先了解和簡單使用過后再閱讀,效果更佳。 寫在前面:Promise這一章的順序對于未接觸過使用過Promise的童鞋而言略抽象了,前邊幾章主要為了說明Promise和之前的異步方式相比有什么優勢和它能解決什么問題,后邊才...

    mumumu 評論0 收藏0
  • 一道筆試題引發的Promise筆記

    摘要:對象是一個返回值的代理,這個返回值在對象創建時未必已知。這使得異步方法可以像同步方法那樣返回值異步方法會返回一個包含了原返回值的對象來替代原返回值。 前言 近來參加校招筆試,發現有好幾道關于Promise的題目。然而我都沒有了解過。所以,這篇文章以網易筆試的一道題開始,記錄關于Promise的那些事。文章地址:http://lsxj615.com/2016/08/04... 筆試題 c...

    _Suqin 評論0 收藏0

發表評論

0條評論

Aldous

|高級講師

TA的文章

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