成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

深入理解ES6筆記(十一)Promise與異步編程

RayKr / 1191人閱讀

摘要:回調(diào)函數(shù)模式類似于事件模型,因為異步代碼也會在后面的一個時間點才執(zhí)行如果回調(diào)過多,會陷入回調(diào)地獄基礎(chǔ)可以當做是一個占位符,表示異步操作的執(zhí)行結(jié)果。函數(shù)可以返回一個,而不必訂閱一個事件或者向函數(shù)傳遞一個回調(diào)函數(shù)。

主要知識點:Promise生命周期、Promise基本操作、Promise鏈、響應多個Promise以及集成Promise

《深入理解ES6》筆記 目錄
異步編程

JavaScript引擎中,只有一個主線程,當執(zhí)行JavaScript代碼塊時,不允許其他代碼塊執(zhí)行,而事件機制和回調(diào)機制的代碼塊會被添加到任務(wù)隊列(或者叫做堆棧)中,當符合某個觸發(fā)回調(diào)或者事件的時候,就會執(zhí)行該事件或者回調(diào)函數(shù)。

事件模型

瀏覽器初次渲染DOM的時候,我們會給一些DOM綁定事件函數(shù),只有當觸發(fā)了這些DOM事件函數(shù),才會執(zhí)行他們:

let button = document.getElementById("my-btn");
button.onclick = function(event) {
    console.log("Clicked");
};
回調(diào)模式

當 Node.js 被創(chuàng)建時,它通過普及回調(diào)函數(shù)編程模式提升了異步編程模型?;卣{(diào)函數(shù)模式類似于事件模型,因為異步代碼也會在后面的一個時間點才執(zhí)行:

readFile("example.txt", function(err, contents) {
    if (err) {
        throw err;
    }
    console.log(contents);
});
console.log("Hi!");

如果回調(diào)過多,會陷入回調(diào)地獄;

Promise 基礎(chǔ)

Promise可以當做是一個占位符,表示異步操作的執(zhí)行結(jié)果。函數(shù)可以返回一個Promise,而不必訂閱一個事件或者向函數(shù)傳遞一個回調(diào)函數(shù)。

// readFile 承諾會在將來某個時間點完成
let promise = readFile("example.txt");

在此代碼中, readFile() 實際上并未立即開始讀取文件,這將會在稍后發(fā)生。此函數(shù)反而會返回一個 Promise 對象以表示異步讀取操作,因此你可以在將來再操作它。

Promise 的生命周期

Promise的生命周期:進行中(pending),已經(jīng)完成(fulfilled),拒絕(rejected)
每個 Promise 都會經(jīng)歷一個短暫的生命周期,初始為掛起狀態(tài)(pending state) ,這表示異步操作尚未結(jié)束。一個掛起的 Promise 也被認為是未決的(unsettled )。一旦異步操作結(jié)束, Promise就會被認為是已決的(settled ) ,并進入兩種可能狀態(tài)之一:

已完成(fulfilled ) : Promise 的異步操作已成功結(jié)束;

已拒絕(rejected ) : Promise 的異步操作未成功結(jié)束,可能是一個錯誤,或由其他原因?qū)е隆?/p>

內(nèi)部的[[PromiseState]] 屬性會被設(shè)置為"pending" 、 "fulfilled" 或 "rejected",以反映Promise的狀態(tài)。該屬性并未在 Promise 對象上被暴露出來,因此你無法以編程方式判斷 Promise 到底處于哪種狀態(tài)。不過你可以使用then()方法在 Promise 的狀態(tài)改變時執(zhí)行一些特定操作。

then()

then() 方法在所有的 Promise 上都存在,并且接受兩個參數(shù)。第一個參數(shù)是 Promise 被完成時要調(diào)用的函數(shù),與異步操作關(guān)聯(lián)的任何附加數(shù)據(jù)都會被傳入這個完成函數(shù)。第二個參數(shù)則是 Promise 被拒絕時要調(diào)用的函數(shù):

let promise = readFile("example.txt");
promise.then(function(contents) {
    // 完成
    console.log(contents);
}, function(err) {
    // 拒絕
    console.error(err.message);
});
promise.then(function(contents) {
    // 完成
    console.log(contents);
});
promise.then(null, function(err) {
    // 拒絕
    console.error(err.message);
});

catch() 方法

其行為等同于只傳遞拒絕處理函數(shù)給 then()

promise.catch(function(err) {
    // 拒絕
    console.error(err.message);
});
// 等同于:
promise.then(null, function(err) {
    // 拒絕
    console.error(err.message);
});
創(chuàng)建未決的 Promise

Promise 使用 Promise 構(gòu)造器來創(chuàng)建:

// Node.js 范例
let fs = require("fs");
function readFile(filename) {
    return new Promise(function(resolve, reject) {
        // 觸發(fā)異步操作
        fs.readFile(filename, { encoding: "utf8" }, function(err, contents) {
            // 檢查錯誤
            if (err) {
                reject(err);
                return;
            }
            // 讀取成功
            resolve(contents);
        });
    });
}
let promise = readFile("example.txt");
// 同時監(jiān)聽完成與拒絕
promise.then(function(contents) {
    // 完成
    console.log(contents);
}, function(err) {
    // 拒絕
    console.error(err.message);
});

romise構(gòu)造函數(shù)接受一個函數(shù)作為參數(shù),該函數(shù)的兩個參數(shù)分別是resolve和reject。它們是兩個函數(shù),由 JavaScript 引擎提供,不用自己部署。
執(zhí)行器會在 readFile() 被調(diào)用時立即運行

let promise = new Promise(function(resolve, reject) {
    console.log("Promise");
    resolve();
});
console.log("Hi!");

//輸出結(jié)果
Promise
Hi!
創(chuàng)建已決的 Promise Promise.resolve()

Promise.resolve()方法接收一個參數(shù),并會返回一個處于已完成狀態(tài)的 Promise ,在then()方法中使用完成處理函數(shù)才能提取該完成態(tài)的Promise傳遞的值,例如:

let promise = Promise.resolve(42);
promise.then(function(value) {
    console.log(value); // 42
});
Promise.reject()

可以使用Promise.reject()方法來創(chuàng)建一個已拒絕狀態(tài)的Promise,同樣只有在拒絕處理函數(shù)中或者catch()方法中才能接受reject()方法傳遞的值:

let promise = Promise.reject(42);
promise.catch(function(value) {
    console.log(value); // 42
});

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/97025.html

相關(guān)文章

  • 深入理解ES6筆記——導讀

    摘要:最近買了深入理解的書籍來看,為什么學習這么久還要買這本書呢主要是看到核心團隊成員及的創(chuàng)造者為本書做了序,作為一個粉絲,還是挺看好這本書能給我?guī)硪粋€新的升華,而且本書的作者也非常厲害。 使用ES6開發(fā)已經(jīng)有1年多了,以前看的是阮一峰老師的ES6教程,也看過MDN文檔的ES6語法介紹。 最近買了《深入理解ES6》的書籍來看,為什么學習ES6這么久還要買這本書呢?主要是看到Daniel A...

    Godtoy 評論0 收藏0
  • JavaScript 異步編程的四種方式

    摘要:異步編程是每個使用編程的人都會遇到的問題,無論是前端的請求,或是的各種異步。本文就來總結(jié)一下常見的四種處理異步編程的方法。利用一種鏈式調(diào)用的方法來組織異步代碼,可以將原來以回調(diào)函數(shù)形式調(diào)用的代碼改為鏈式調(diào)用。 異步編程是每個使用 JavaScript 編程的人都會遇到的問題,無論是前端的 ajax 請求,或是 node 的各種異步 API。本文就來總結(jié)一下常見的四種處理異步編程的方法。...

    microelec 評論0 收藏0
  • 深入理解ES6筆記—— Promise異步編程(11)

    摘要:為什么要異步編程我們在寫前端代碼時,經(jīng)常會對做事件處理操作,比如點擊激活焦點失去焦點等再比如我們用請求數(shù)據(jù),使用回調(diào)函數(shù)獲取返回值。這些都屬于異步編程?;卣{(diào)有多個狀態(tài),當響應成功和失敗都有不同的回調(diào)函數(shù)。 為什么要異步編程 我們在寫前端代碼時,經(jīng)常會對dom做事件處理操作,比如點擊、激活焦點、失去焦點等;再比如我們用ajax請求數(shù)據(jù),使用回調(diào)函數(shù)獲取返回值。這些都屬于異步編程。 也許你...

    ssshooter 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<