中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

深入理解JS異步編程-Promise

前言

創(chuàng)新互聯(lián)建站是一家網(wǎng)站設計公司,集創(chuàng)意、互聯(lián)網(wǎng)應用、軟件技術為一體的創(chuàng)意網(wǎng)站建設服務商,主營產(chǎn)品:響應式網(wǎng)站、高端網(wǎng)站設計、成都營銷網(wǎng)站建設。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡互動的體驗,以及在手機等移動端的優(yōu)質(zhì)呈現(xiàn)。網(wǎng)站建設、網(wǎng)站設計、移動互聯(lián)產(chǎn)品、網(wǎng)絡運營、VI設計、云產(chǎn)品.運維為核心業(yè)務。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務。

“JS 是基于單線程事件循環(huán)”的概念構建的,回調(diào)函數(shù)不會立即執(zhí)行,由事件輪詢?nèi)z測事件是否執(zhí)行完畢,當執(zhí)行完有結果后,將結果放入回調(diào)函數(shù)的參數(shù)中,然后將回調(diào)函數(shù)添加到事件隊列中等待被執(zhí)行。

同時也講了回調(diào)函數(shù)的問題:

一是“回調(diào)地獄”,因為異步回調(diào)函數(shù)的特點:回調(diào)函數(shù)是作為異步函數(shù)的參數(shù),一層一層嵌套,當嵌套過多,將使代碼邏輯變得混亂,也無法做好錯誤捕捉和處理(只能在回調(diào)函數(shù)內(nèi)部 try catch)。

二是回調(diào)的執(zhí)行方式不符合自然語言的線性思維方式,不容易被理解。

三是控制反轉(控制權在其他人的代碼上),假如異步函數(shù)是別人提供的庫,我們把回調(diào)函數(shù)傳進去,我們并不能知道異步函數(shù)在調(diào)用回調(diào)函數(shù)之外做了什么事情。

func1(() => {
func2(() => {
func3(() => {
func4(() => {
try {
...
} catch (err){
...
}
})
});
});
});

一、Promise 原理

首先,Promise 中文翻譯為“承諾”, 是 JavaScript 的一種對象,表示承諾終將返回一個結果,無論成功還是失敗。
Promise 有三個狀態(tài):等待中(pending),完成(fullfilled),失?。╮ejected), Promise 的設計具有原子性,狀態(tài)一旦從 pending 狀態(tài)轉換為 fullfilled 狀態(tài)或者 rejected 狀態(tài)后,將不能被改變。

深入理解JS異步編程-Promise

var promise1 = new Promise((resolve, reject) => {
console.log("Promise 構造器會立即執(zhí)行");
setTimeout(function (){
if(true) {
resolve("完成");
} else {
reject("失敗");
}
}, 1000);
})
promise1
.then((result) => {
// do something
console.log(result);
return 1
// return Promise.resolve(1); // 返回一個決議為成功的 promise 實例
// return Promise.reject("error"); // 返回一個決議為拒絕的 Promise 實例
})
.then((result) => {
// .then() 方法會返回一個 promise, 完成調(diào)用的參數(shù)為前一個 promise 的返回值或者決議值。
// do other things
console.log(result);
throw new Error("錯誤") // 拋出錯誤是隱式拒絕
})
.catch((error) => {
// 捕捉錯誤
console.log(error)
})
.then(() => {
// 還能繼續(xù)執(zhí)行!
})
.finally(() => {
// always do somethings
console.log("finally!")
})

二、Promise 的優(yōu)勢

1.鏈式調(diào)用

Promise 使用 then 方法后還會返回一個新的 Promise 對象,便于我們傳遞狀態(tài)數(shù)據(jù),同時鏈式寫法接近于同步寫法,更符合線性思維。

2.錯誤捕捉

相比回調(diào)函數(shù)的錯誤無法在外部捕捉的問題,Promise 能夠為一連串的異步調(diào)用提供錯誤處理。

3.控制反轉再反轉

由于第三方提供的異步函數(shù),無法保證回調(diào)函數(shù)如何被執(zhí)行,但是 Promise 的特點,能夠保證異步函數(shù)只能被 resolve 一次,以及始終以異步的形式執(zhí)行代碼。

4.可以利用 Promise.all 和 Promise.race 來解決 Promise 始終未決議和并行 Promise 嵌套的問題

三、Promise 的不足

1.每個 .then() 都是一個獨立的作用域

加入有很多個 .then() 方法,就會創(chuàng)建很多個獨立的作用域,那么將只能通過外面包裹一層函數(shù)作用域的閉包來共享狀態(tài)數(shù)據(jù)

2.無法取消單個 .then()

當 Promise 鏈中任意一個 .then() 方法中有語句執(zhí)行錯誤后,盡管經(jīng)過 catch 方法的錯誤處理,還是并不會中斷整個 Promise 鏈的執(zhí)行。

3.無法得知進度

由于 Promise 只能從 pending 到 fullfilled 或 rejected 狀態(tài),無法得知 pending 階段的進度。

四、Promise 應用

// Promise 封裝 ajax
function fetch(method, url, data){
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
var method = method || "GET";
var data = data || null;
xhr.open(method, url, true);
xhr.onreadystatechange = function() {
if(xhr.status === 200 && xhr.readyState === 4){
resolve(xhr.responseText);
} else {
reject(xhr.responseText);
}
}
xhr.send(data);
})
}
// 使用
fetch("GET", "/some/url.json", null)
.then(result => {
console.log(result);
})
// 封裝 nodejs error first 風格回調(diào)
function readFile(url) {
return new Promise((resolve, reject) => {
fs.readFile(url,'utf8', (err, data) => {
if(err) {
reject(err);
return;
}
resolve(data)
}) 
})
}

五、總結

Promise 是 ES6 提出的簡化異步流程控制新規(guī)范,強調(diào)異步任務的完成狀態(tài)且具有原子性,這使得我們的代碼更容易追蹤和維護。Promise 在事件輪詢中屬于異步事件隊列中的微任務,而微任務總是一次性全部執(zhí)行,而宏任務是每輪輪詢執(zhí)行一個。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

分享題目:深入理解JS異步編程-Promise
文章鏈接:http://www.rwnh.cn/article6/jihdig.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App設計電子商務、網(wǎng)站建設、定制網(wǎng)站、外貿(mào)建站、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設
武胜县| 天门市| 泸西县| 年辖:市辖区| 岐山县| 富锦市| 兴城市| 湘潭县| 柘荣县| 南陵县| 肃宁县| 泉州市| 阳泉市| 伊宁县| 滦南县| 台江县| 吉木萨尔县| 永宁县| 社旗县| 博罗县| 舟山市| 昌宁县| 青田县| 宁陵县| 吉木乃县| 民勤县| 忻城县| 县级市| 普宁市| 潮安县| 齐齐哈尔市| 吉林省| 北流市| 江城| 民乐县| 宿松县| 水富县| 娄烦县| 夏邑县| 雷波县| 永春县|