亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

異步發(fā)展流程 —— Promise 的基本使用

venmos / 2942人閱讀

摘要:閱讀原文簡介是的新特性,提供了對異步編程控制的新的解決方案,在過去書寫異步代碼時(shí)要靠回調(diào)函數(shù),當(dāng)異步操作依賴于其他異步操作的返回值時(shí),會出現(xiàn)一種現(xiàn)象,被程序員們稱為回調(diào)地獄,即多層回調(diào)函數(shù)嵌套,這種代碼的可讀性維護(hù)性都很差,因此誕生了,當(dāng)然


閱讀原文


Promise 簡介

Promise 是 ES6 的新特性,提供了對 js 異步編程控制的新的解決方案,在過去書寫異步代碼時(shí)要靠回調(diào)函數(shù),當(dāng)異步操作依賴于其他異步操作的返回值時(shí),會出現(xiàn)一種現(xiàn)象,被程序員們稱為 “回調(diào)地獄”,即多層回調(diào)函數(shù)嵌套,這種代碼的可讀性、維護(hù)性都很差,因此誕生了 Promise,當(dāng)然 Promise 并不是完全擺脫回調(diào),而只是改變了傳遞回調(diào)的位置,大大減少了回調(diào)函數(shù)嵌套。


Promise 的使用 1、實(shí)例方法 then

Promise 中的代碼默認(rèn)是同步執(zhí)行的,then 方法中的回調(diào)在微任務(wù)隊(duì)列中執(zhí)行,在 Promise 的 then 方法中支持傳入兩個參數(shù),一個是成功的回調(diào),一個是失敗的回調(diào),在 Promise 中調(diào)用了 resolve 方法,就會在 then 中執(zhí)行成功的回調(diào),調(diào)用了 reject 方法,就會在 then 中執(zhí)行失敗的回調(diào),成功的回調(diào)和失敗的回調(diào)只能執(zhí)行一個,resolvereject 方法調(diào)用時(shí)傳入的參數(shù)會傳遞給 then 方法中對應(yīng)的回調(diào)函數(shù)。

// 執(zhí)行 resolve
let p = new Promise((resolve, reject) => {
    console.log(1);
    resovle(3);
});

console.log(2);

p.then(data => {
    console.log(data);
}, err => {
    console.log(err);
});

// 1
// 2
// 3
// 執(zhí)行 reject
let p = new Promise((resolve, reject) => {
    reject();
});

p.then(() => {
    console.log(1);
}, () => {
    console.log(2);
});

// 2

如果 Promise 中發(fā)生錯誤,就會在 then 中執(zhí)行失敗的回調(diào)。

// 失敗的回調(diào)
let p = new Primise((resolve, reject) => {
    throw new Error();
});

p.then(() => {
    console.log(1);
}, () => {
    console.log("報(bào)錯啦");
});

// 報(bào)錯啦

當(dāng)同一個 Promise 實(shí)例的 then 方法多次調(diào)用時(shí),就會多次執(zhí)行。

// 多次調(diào)用 then
let p = new Promise((resolve, reject) => {
    resolve("成功");
});

p.then(data => {
    console.log(data);
});

p.then(data => {
    console.log(data);
});

// 成功
// 成功
2、Promise 的鏈?zhǔn)秸{(diào)用

Promise 支持鏈?zhǔn)秸{(diào)用,每次調(diào)用一次 then 方法都會返回一個新的 Promise實(shí)例,如果該 then 方法中執(zhí)行的回調(diào)函數(shù)有返回值,并且這個返回值會作為返回的下一個 Promise 實(shí)例的 then 方法回調(diào)的參數(shù),如果 then 方法的返回值是一個 Promise 實(shí)例,那就返回一個新的 Promise 實(shí)例,將 then 返回的 Promise 實(shí)例執(zhí)行后的結(jié)果作為返回 Promise 實(shí)例回調(diào)的參數(shù)。

// 鏈?zhǔn)秸{(diào)用 then
function read(url) {
    return new Promise((resolve, reject) => {
        fs.readFile(url, "utf8", (err, data) => {
            if (err) reject(err);
            resolve(data);
        })
    });
}

read("1.txt").then(data => {
    // 假設(shè)此時(shí)讀到的內(nèi)容為 Hello world
    return data;
}, err => {
    console.log(err);
}).then(data => {
    console.log(data);
    // Hello world
}, err => {
    console.log(err);
});

read("1.txt").then(data => {
    // 假如此時(shí)讀到的 1.txt 的內(nèi)容為 2.txt 的字符串,2.txt 的內(nèi)容為 Hello world
    return read(data);
}, err => {
    console.log(err);
}).then(data => {
    console.log(data);
    // Hello world
}, err => {
    console.log(err);
});

在 Promise 實(shí)例的 then 中如果有錯誤產(chǎn)生,在返回的新的 Promise 實(shí)例中的 then 方法中會執(zhí)行錯誤的回調(diào)。

// 鏈?zhǔn)秸{(diào)用 then 出錯
let p = new Promise((resolve, reject) => {
    resolve();
});

p.then(() => {
    console.log("success", 1);
    throw new Error();
}, () => {
    console.log("error", 1);
}).then(() => {
    console.log("success", 2);
}, () => {
    console.log("error", 2)
})

// success 1
// error 2

在 Promise 中有三個狀態(tài):

pending:等待態(tài)

fulfilled:成功態(tài)

rejected:失敗態(tài)

Promise 實(shí)例的狀態(tài)只能從 pendingfulfilled 或從 pendingrejected,狀態(tài)一旦發(fā)生變化就不可逆,所以 Promise 實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用與 jQuery 不同,返回的不是 this,只能是一個新的 Promise。

3、實(shí)例方法 catch

在 Promise 中實(shí)例的 catch 方法可以捕獲鏈?zhǔn)秸{(diào)用中的異常,不需要每次調(diào)用 then 方法中都傳入錯誤的回調(diào),在鏈?zhǔn)秸{(diào)用的過程中只要有任何一個 then 中出現(xiàn)錯誤,都會被 catch 方法捕獲到。

// catch 方法
let p = new Promise((resolve, reject) => {
    resolve();
});

p.then(() => {
    throw new Error();
    console.log("success", 1);
}).then(() => {
    console.log("success", 2);
}).catch(() => {
    console.log("出錯了");
});

// 出錯了

p.then(() => {
    console.log("success", 1);
}).then(() => {
    throw new Error();
    console.log("success", 2);
}).catch(() => {
    console.log("出錯了");
});

// success 1
// 出錯了
4、靜態(tài)方法 Promise.all

Promise 中的靜態(tài)方法 all 可以實(shí)現(xiàn)多個 Promise 實(shí)例的并行,當(dāng)所有結(jié)果都為成功時(shí),返回一個數(shù)組,該數(shù)組存儲的為每一個 Promise 實(shí)例的返回結(jié)果,每一個 Promise 實(shí)例的返回順序先后不固定,但是返回值的數(shù)組內(nèi)存儲每一個 Promise 的返回值的結(jié)果按照最初傳入的順序排列,all 方法的返回值為一個新的 Promise 實(shí)例,返回的數(shù)組作為返回新 Promise 的 then 方法成功回調(diào)的參數(shù)。

當(dāng) all 傳入的參數(shù)數(shù)組中的 Promise 實(shí)例執(zhí)行時(shí),只要有一個失敗,則直接返回該 Promise 實(shí)例失敗的結(jié)果或錯誤信息。

// Promise.all 方法
let p1 = new Promise((resolve, reject) => {
    resolve(1);
});

let p2 = new Promise((resolve, reject) => {
    resolve(2);
});

Promise.all([p1, p2]).then(data => {
    console.log(data);
});

// [1, 2]
// Promise.all 錯誤捕獲
let p1 = new Promise((resolve, reject) => {
    resolve(1);
});

let p2 = new Promise((resolve, reject) => {
    reject(2);
});

Promise.all([p1, p2]).then(data => {
    console.log(data);
}).catch(err => {
    console.log(err);
});

// 2
5、靜態(tài)方法 Promise.race

Promise 的靜態(tài)方法 race 的用法和 all 類似,參數(shù)同為一個存儲 Promise 實(shí)例的數(shù)組,返回值同樣是一個新的 Promise 的實(shí)例,不同的是,數(shù)組中的 Promise 實(shí)例只有一個結(jié)果為成功,那就直接返回這個結(jié)果(只取出最快返回的結(jié)果),在沒有成功的結(jié)果之前有一個出錯,就直接返回這個錯誤。

// Promise.race 方法
let p1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve(1), 2000);
});

let p2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve(2), 1000);

});

Promise.race([p1, p2]).then(data => {
    console.log(data);
}).catch(err => {
    console.log(err);
});

// 2
// Promise.race 錯誤捕獲
let p1 = new Promise((resolve, reject) => {
    setTimeout(() => reject(1), 1000);
});

let p2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve(2), 2000);

});

Promise.race([p1, p2]).then(data => {
    console.log(data);
}).catch(err => {
    console.log(err);
});

// 1
6、靜態(tài)方法 Promise.resolve

Promise 的靜態(tài)方法 resolve 可以直接將 Promise 的狀態(tài)變?yōu)槌晒Σ⒎祷匾粋€新的 Promise 實(shí)例,resolve 的參數(shù)會傳遞給返回的新 Promise 實(shí)例 then 中成功回調(diào)。

// Promise.resolve 方法
Promise.resolve("hello").then(data => {
    console.log(data);
});

// hello
7、靜態(tài)方法 Promise.reject

Promise 的靜態(tài)方法 rejectresolve 使用完全相同,都返回一個新的 Promise 實(shí)例,不同的是 reject 的參數(shù)會傳遞給新 Promise 實(shí)例的 then 方法失敗回調(diào)。

// Promise.reject 方法
Promise.reject("出錯了").then(null, err => {
    console.log(err);
});

// 出錯了

當(dāng)成功的回調(diào)不傳遞時(shí),可以使用 null 代替,因?yàn)?null 作為參數(shù)會被忽略掉,將參數(shù)穿透到下一個 then 的回調(diào)中。


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

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

相關(guān)文章

  • 異步發(fā)展流程 —— 異步編程終極大招 async/await

    摘要:簡介指的是兩個關(guān)鍵字,是引入的新標(biāo)準(zhǔn),關(guān)鍵字用于聲明函數(shù),關(guān)鍵字用來等待異步必須是操作,說白了就是的語法糖。最后希望大家在讀過異步發(fā)展流程這個系列之后,對異步已經(jīng)有了較深的認(rèn)識,并可以在不同情況下游刃有余的使用這些處理異步的編程手段。 showImg(https://segmentfault.com/img/remote/1460000018998406?w=1024&h=379); ...

    zhangfaliang 評論0 收藏0
  • 異步發(fā)展流程 —— Generators + co 讓異步更優(yōu)雅

    摘要:遍歷器原有的表示集合的數(shù)據(jù)結(jié)構(gòu),主要有和,在中又加入了和,這樣就有了四種數(shù)據(jù)集合,還可以組合使用它們,如數(shù)組的成員是或,這樣就需要一種統(tǒng)一的接口機(jī)制,用來處理所有不同的數(shù)據(jù)結(jié)構(gòu)。 showImg(https://segmentfault.com/img/remote/1460000018998438?w=900&h=431); 閱讀原文 Generators 簡介 Generato...

    dingda 評論0 收藏0
  • Promise學(xué)習(xí):基礎(chǔ)入門

    摘要:今天來學(xué)習(xí)下吧其實(shí)這在筆試上也是一個考點(diǎn)基本介紹對象是熟悉的名字吧工作組提出的規(guī)范原本只是社區(qū)提出的構(gòu)想一些外部函數(shù)庫率先實(shí)現(xiàn)了該功能中將其寫入了語言標(biāo)準(zhǔn)目的為異步操作提供統(tǒng)一接口是啥它就是一個中一個對象起著代理作用充當(dāng)異步操作與回調(diào)函 今天來學(xué)習(xí)下Promise吧,其實(shí)這在筆試上也是一個考點(diǎn). 基本介紹 Promise對象是CommonJS(熟悉的名字吧- -)工作組提出的規(guī)范.Pr...

    iamyoung001 評論0 收藏0
  • 異步發(fā)展流程 —— 手寫一個符合 Promise/A+ 規(guī)范 Promise

    摘要:構(gòu)造函數(shù)的實(shí)現(xiàn)我們在使用的時(shí)候其實(shí)是使用關(guān)鍵字創(chuàng)建了一個的實(shí)例,其實(shí)是一個類,即構(gòu)造函數(shù),下面來實(shí)現(xiàn)構(gòu)造函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000018998456); 閱讀原文 概述 Promise 是 js 異步編程的一種解決方案,避免了 回調(diào)地獄 給編程帶來的麻煩,在 ES6 中成為了標(biāo)準(zhǔn),這篇文章重點(diǎn)不是敘...

    UnixAgain 評論0 收藏0
  • JavaScript 異步

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。寫一個符合規(guī)范并可配合使用的寫一個符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個需求:在系統(tǒng)初始化時(shí)通過http獲取一個第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個接口,可通過...

    tuniutech 評論0 收藏0

發(fā)表評論

0條評論

venmos

|高級講師

TA的文章

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