国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JavaScript 異步解決方案 Promise 全解析(轉(zhuǎn)載)

這篇具有很好參考價值的文章主要介紹了JavaScript 異步解決方案 Promise 全解析(轉(zhuǎn)載)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?

Promise 是什么?

Promise 是一個 JS 的異步編程解決方案,解決了傳統(tǒng)異步編程回調(diào)地獄的問題。 從語義上來說:Promise 是一個向外部傳達(dá)異步編程操作消息的對象。

Promise 的三種狀態(tài)

JS里一個promise可以有以下幾種基本狀態(tài):

  1. nothing happened yet
  2. "locked in" to another promise
  3. fulfilled
  4. rejected

其中{1,2}為pending,{3,4}為settled,{2,3,4}為resolved,{1}為unresolved。

?

Promise 對象表示一個異步操作,擁有三種狀態(tài):

  1. pending(進(jìn)行中)
  2. fulfilled(已完成)
  3. rejected(已失敗)

只有異步操作的結(jié)果可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無法改變這個狀態(tài)。 其中 pending 為初始狀態(tài),狀態(tài)的變化只有兩種:

  1. pending -> fulfilled(異步任務(wù)完成)
  2. pending -> rejected(異步任務(wù)失?。?/li>

且一旦狀態(tài)改變,狀態(tài)就會凝固,不會再變化了。這就導(dǎo)致 Promise 一旦建立就會立即執(zhí)行,無法取消

Promise 的基本用法

ES6 規(guī)定 Promise 是一個構(gòu)造函數(shù),用來生成 Promise 對象實例。

const promise = new Promise(function(resolve,reject){
    // 異步操作
    if(success){    //異步操作成功
        resolve(value);
    } else{         //異步操作失敗
        reject(err);
    }
})
復(fù)制代碼

Promise 構(gòu)造函數(shù)接收的參數(shù)是一個函數(shù),該函數(shù)有兩個由 JS 引擎指定的參數(shù):resolve 函數(shù) 和 reject 函數(shù)

  • resolve 函數(shù) 有兩個作用:
    1. 將 Promise 狀態(tài)由 pending -> fulfilled(等待態(tài) -> 成功態(tài))
    2. 將異步操作成功的結(jié)果 value 作為參數(shù)傳遞出去。(由后面講的的 then 方法接收)
  • reject 函數(shù) 也有兩個作用:
    1. 將 Promise 狀態(tài)由 pending -> rejected(等待態(tài) -> 失敗態(tài))
    2. 將異步操作失敗的錯誤信息 err 作為參數(shù)傳遞出去。(由后面講的的 then /catch 方法接收)

Promise 的三個實例方法 then catch finally

1. Promise.prototype.then()

Promise 實例具有 then 方法,也就是說 then 方法時定義在原型對象上的。 Promise 實例生成后,可以用 then 方法分別指定 resolve 狀態(tài)和 rejected 狀態(tài)的回調(diào)函數(shù):獲取 Promise 內(nèi)部的異步操作狀態(tài)。

promise.then(
  function (value) {
    console.log(value); //異步操作成功時(fulfilled 態(tài))調(diào)用
  },
  function (err) {
    console.log(err); //異步操作失敗時(rejected 態(tài))調(diào)用
  }
);
復(fù)制代碼

then 方法可以接收兩個回調(diào)函數(shù)作為參數(shù):

第一個回調(diào)函數(shù)在 promise 實例變?yōu)?fulfilled 時調(diào)用,并獲取 resolve 函數(shù)傳遞的參數(shù) value。 第二個回調(diào)函數(shù)在 promise 實例變?yōu)?rejected 時調(diào)用,并獲取 reject 函數(shù)傳遞的參數(shù) err。 then 方法的返回值是一個新的 Promise 對象,因此可以 .then 可以鏈?zhǔn)秸{(diào)用。

2. Promise.prototype.catch()

Promise 實例的 catch 方法用于指定發(fā)生錯誤時的回調(diào)函數(shù),是 .then(null, rejection) 的語法糖。

promise
  .then(function (val) {
    console.log(val); //異步操作成功時(fulfilled 態(tài))調(diào)用
  })
  .catch(function (err) {
    console.log(err); //異步操作失敗時(rejected 態(tài))調(diào)用
  });
復(fù)制代碼

上面代碼中, 如果 promise 對象狀態(tài)變?yōu)?fulfilled ,則會調(diào)用 then 方法指定的回調(diào)函數(shù);如果異步操作拋出錯誤,狀態(tài)就會變?yōu)?rejected ,就會調(diào)用 catch 方法指定的回調(diào)函數(shù)。另外,then 方法指定的回調(diào)函數(shù),如果運(yùn)行拋出錯誤,也會被 catch 方法捕獲。

promise
  .then((val) => console.log("fulfilled:", val))
  .catch((err) => console.log("rejected:", err));
// 等價于
promise
  .then((val) => console.log("fulfilled:", val))
  .then(null, (err) => console.log("rejected:", err));
復(fù)制代碼

如果 Promise 狀態(tài)已經(jīng)變成 resolved,再拋出錯誤是無效的。因為 Promise 的狀態(tài)一旦改變,就永久保持該狀態(tài),不會再變了。 Promise 對象的錯誤具有冒泡性質(zhì),會一直向后傳遞,直到被捕獲為止,也就是說錯誤總會被下一個 catch 語句捕獲。

3. Promise.prototype.finally()

Promise 實例的 finally 方法用于指定不管狀態(tài)最終如何,都會執(zhí)行的函數(shù)。是 .then(function,function)function 相同)的語法糖。

promise.finally((message) => console.log("狀態(tài)變化了", message));
// 等價于
promise.then(
  (message) => console.log("狀態(tài)變化了", message),
  (message) => console.log("狀態(tài)變化了", message)
);
// 無論成功還是失敗都會執(zhí)行
復(fù)制代碼

Promise 的兩個靜態(tài)方法 all 和 race

1. Promise.all()

Promise.all(arr) 方法是掛載在 Promise 構(gòu)造函數(shù)上的靜態(tài)方法,它傳入?yún)?shù)為一個 Promise 對象數(shù)組 arr,返回值為一個 Promise 實例:

該實例會在 Promise 對象數(shù)組 內(nèi)所有對象的狀態(tài)變?yōu)?fulfilled 時調(diào)用內(nèi)部的 resolve 函數(shù); 該實例在 Promise 對象數(shù)組 內(nèi)任意對象的狀態(tài)變?yōu)?rejected 時調(diào)用 reject 函數(shù)(reject 函數(shù)的參數(shù)為第一個錯誤的 promise 對象的 err); 有點類似于 JS 里的與操作(&&):所有表達(dá)式為真時返回真,任意表達(dá)式為假時返回假。

let p1 = new Promise((resolve,reject)=>{
resolve('p1-success'),
})
let p2 = new Promise((resolve,reject)=>{
resolve('p2-success'),
})
let p3 = new Promise((resolve,reject)=>{
reject('p1-error'),
})

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

//輸出 p1-error
復(fù)制代碼

需要特別注意的是,Promise.all() 獲得的成功結(jié)果的數(shù)組里面的數(shù)據(jù)順序和 Promise.all() 接收到的數(shù)組順序是一致的,即 p1 的結(jié)果在前,即便 p1 的結(jié)果獲取的比 p2 要晚。這帶來了一個絕大的好處:在前端開發(fā)請求數(shù)據(jù)的過程中,偶爾會遇到發(fā)送多個請求并根據(jù)請求順序獲取和使用數(shù)據(jù)的場景,使用 Promise.all() 毫無疑問可以解決這個問題。

2. Promise.race()

Promise.race(arr) 方法返回一個 promise 實例,一旦 arr 中的某個 promise 對象解決或拒絕,返回的 promise 就會解決或拒絕。 顧名思義,Promise.race 就是賽跑的意思,意思就是說,Promise.race([p1, p2, p3])里面哪個結(jié)果獲得的快,就返回那個結(jié)果,不管結(jié)果本身是成功狀態(tài)還是失敗狀態(tài)。

let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("p1-success");
  }, 1000);
});
let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("p2-success");
  }, 500);
});
let p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject("p3-error");
  }, 1000);
});

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

//輸出 p2-success


作者:Prayx
鏈接:https://juejin.cn/post/6862929170390450183
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。文章來源地址http://www.zghlxwxcb.cn/news/detail-711190.html

到了這里,關(guān)于JavaScript 異步解決方案 Promise 全解析(轉(zhuǎn)載)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [javascript核心-04]徹底弄懂Promise異步編程

    本文github地址:JavaScript_Interview_Everything 大前端知識體系與面試寶典,從前端到后端,全棧工程師,成為六邊形戰(zhàn)士 1.1. 快速上手 01快手上手.js 02.若傳入的是另一個promise對象,則狀態(tài)由傳入的promise對象決定 03.若傳入了一個實現(xiàn)了 then 方法的對象,則執(zhí)行該then方法且由此方法

    2024年02月08日
    瀏覽(22)
  • 【前端面經(jīng)】JS-異步解決方案

    同步和異步 眾所周知, JavaScript 是一門單線程的語言, 單線程就意味著同一時間只能執(zhí)行一個任務(wù), 當(dāng)前任務(wù)執(zhí)行結(jié)束, 才會執(zhí)行下一個任務(wù). 這種模式的好處就是執(zhí)行環(huán)境比較單純, 但壞處也很明顯, 一旦有某個任務(wù)卡住了, 就會導(dǎo)致整個程序阻塞. 為了解決這個問題, JS將任務(wù)的

    2024年02月02日
    瀏覽(31)
  • Go異步任務(wù)解決方案 Asynq

    Go異步任務(wù)解決方案 Asynq

    今天為大家介紹一個Go處理異步任務(wù)的解決方案:Asynq,是一個 Go 庫,用于排隊任務(wù)并與 worker 異步處理它們。它由Redis提供支持,旨在實現(xiàn)可擴(kuò)展且易于上手。 Asynq 是一個 Go 庫,用于對任務(wù)進(jìn)行排隊并與工作人員異步處理它們。 Asynq 工作原理的高級概述: 客戶端將任務(wù)放入

    2024年01月17日
    瀏覽(19)
  • JS for循環(huán)異步解決方案

    JavaScript中的for循環(huán)是一種同步操作,它將阻塞代碼的執(zhí)行,直到循環(huán)完成。但是,在處理異步操作時,使用同步for循環(huán)會導(dǎo)致問題。 為了解決這個問題,可以使用以下兩種異步解決方案: 遞歸是一種有效的解決方案,它可以確保異步操作按照預(yù)期執(zhí)行。以下是使用遞歸實現(xiàn)

    2024年02月13日
    瀏覽(40)
  • 【go】異步任務(wù)解決方案Asynq實戰(zhàn)

    Asynq 是一個 Go 庫,一個高效的分布式任務(wù)隊列。 Asynq 工作原理: 客戶端(生產(chǎn)者)將任務(wù)放入隊列 服務(wù)器(消費(fèi)者)從隊列中拉出任務(wù)并為每個任務(wù)啟動一個工作 goroutine 多個工作人員同時處理任務(wù) git庫:https://github.com/hibiken/asynq Asynq 使用 Redis 作為消息代理。client 和 se

    2024年02月10日
    瀏覽(20)
  • 詳解JS的四種異步解決方案!

    詳解JS的四種異步解決方案!

    目錄 同步異步的概念 js中異步的應(yīng)用場景 實現(xiàn)異步的四種方法 1、 回調(diào)函數(shù) 2、Promise 3、Generator 4、 async/await ????????「異步編程」 是前端工程師日常開發(fā)中經(jīng)常會用到的技術(shù),也是校招面試過程中常考的一個知識點。 ????????通過掌握 「異步編程」 的四種方式,可

    2024年01月18日
    瀏覽(43)
  • Redux異步解決方案 1. Redux-Thunk中間件

    Redux異步解決方案 1. Redux-Thunk中間件

    簡單介紹一下 thunk ,這是一個中間件,是解決 redux 異步問題產(chǎn)生的。我們都知道,在使用 redux 的時候,通過 dispatch 一個 action 發(fā)生到 reducer 然后傳遞給 store 修改狀態(tài) 一系列都是同步的,那如果說我 dispatch 一個 action 這個 action 幫我請求一下接口數(shù)據(jù),你發(fā)現(xiàn)接口請求是異步

    2024年02月09日
    瀏覽(29)
  • 使用aiohttp異步調(diào)用API+request上傳文件中文文檔名亂碼解決方案

    有時候在調(diào)用需要用異步調(diào)用API接口。在python中有很多框架,比如 asyncio , Celery , Quart 等。這里我選擇了 asyncio 。Python 3.5以上版本內(nèi)置了 asyncio 庫,可以用來編寫單線程的并發(fā)代碼。可以使用此庫與 aiohttp 結(jié)合來發(fā)送異步HTTP請求。 參數(shù)為JSON 需要同時上傳文件和JSON參數(shù)

    2024年02月04日
    瀏覽(23)
  • [javascript核心-09] 徹底解決js中的類型檢測方案

    typeof 基于數(shù)據(jù)類型的值(二進(jìn)制)進(jìn)行檢測 返回結(jié)果為字符串 typeof NaN 結(jié)果為 number typeof null 結(jié)果為 Object .對象存儲以 000 開頭,而 null 也是如此。 typeof 不能細(xì)分對象,結(jié)果都是 Object typeof function(){} 結(jié)果為 function instanceof 檢測某個構(gòu)造函數(shù)是否出現(xiàn)在某實例的原型鏈上 返回結(jié)

    2024年02月16日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包