国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

盤點JavaScript中的Promise鏈的高級用法

開發(fā) 前端
有一系列的異步任務(wù)要一個接一個地執(zhí)行 — 例如,加載腳本。如何寫出更好的代碼呢?Promise 提供了一些方案來做到這一點。

一、前言

有一系列的異步任務(wù)要一個接一個地執(zhí)行 — 例如,加載腳本。如何寫出更好的代碼呢?

Promise 提供了一些方案來做到這一點。

二、案例分析

1.運行流程如下

它的理念是將 result 通過 .then 處理程序(handler)鏈進(jìn)行傳遞。

//1. 初始 promise 在 1 秒后進(jìn)行 resolve (*),


//2. 然后 .then 處理程序(handler)被調(diào)用 (**)。


//3. 它返回的值被傳入下一個 .then 處理程序(handler)(***)。

之所以這么運行,是因為對 promise.then 的調(diào)用會返回了一個 promise,所以可以在其之上調(diào)用下一個 .then。

當(dāng)處理程序(handler)返回一個值時,它將成為該 promise 的 result,所以將使用它調(diào)用下一個 .then。

新手常犯的一個經(jīng)典錯誤:從技術(shù)上講,也可以將多個 .then 添加到一個 promise 上。但這并不是 promise 鏈(chaining)。

例 :

let promise = new Promise(function(resolve, reject) {
  setTimeout(() => resolve(1), 1000);
});
promise.then(function(result) {
  alert(result); // 1
  return result * 2;
});
promise.then(function(result) {
  alert(result); // 1
  return result * 2;
});
promise.then(function(result) {
  alert(result); // 1
  return result * 2;
});

在這里所做的只是一個 promise 的幾個處理程序(handler)。他們不會相互傳遞 result;相反,它們之間彼此獨立運行處理任務(wù)。

例1:fetch

在前端編程中,promise 通常被用于網(wǎng)絡(luò)請求。

案例:

將使用 [etch方法從遠(yuǎn)程服務(wù)器加載用戶信息。它有很多可選的參數(shù)。

let promise = fetch(url);

執(zhí)行這條語句,向 url 發(fā)出網(wǎng)絡(luò)請求并返回一個 promise。當(dāng)遠(yuǎn)程服務(wù)器返回 header(是在 全部響應(yīng)加載完成前)時,該 promise 用使用一個 response 對象來進(jìn)行 resolve。

為了讀取完整的響應(yīng),應(yīng)該調(diào)用 response.text() 方法:當(dāng)全部文字(full text)內(nèi)容從遠(yuǎn)程服務(wù)器下載完成后,它會返回一個 promise,該 promise 以剛剛下載完成的這個文本作為 result 進(jìn)行 resolve。

下面這段代碼向 user.json 發(fā)送請求,并從服務(wù)器加載該文本:

fetch('/article/promise-chaining/user.json')
  // 當(dāng)遠(yuǎn)程服務(wù)器響應(yīng)時,下面的 .then 開始執(zhí)行
  .then(function(response) {
    // 當(dāng) user.json 加載完成時,response.text() 會返回一個新的 promise
    // 該 promise 以加載的 user.json 為 result 進(jìn)行 resolve
    return response.text();
  })
  .then(function(text) {
    // ...這是遠(yuǎn)程文件的內(nèi)容
    alert(text); // {"name": "iliakan", "isAdmin": true}
  });

從 fetch 返回的 response 對象還包括 response.json() 方法,該方法讀取遠(yuǎn)程數(shù)據(jù)并將其解析為 JSON。在的例子中,這更加方便,所以讓切換到這個方法。

為了簡潔,還將使用箭頭函數(shù):

// 同上,但是使用 response.json() 將遠(yuǎn)程內(nèi)容解析為 JSON
fetch('/article/promise-chaining/user.json')
  .then(response => response.json())
  .then(user => alert(user.name)); // iliakan, got user name

現(xiàn)在,讓用加載好的用戶信息搞點事情。

例如,可以多發(fā)一個到 GitHub 的請求,加載用戶個人資料并顯示頭像:

// 發(fā)送一個對 user.json 的請求
fetch('/article/promise-chaining/user.json')
  // 將其加載為 JSON
  .then(response => response.json())
  // 發(fā)送一個到 GitHub 的請求
  .then(user => fetch(`https://api.github.com/users/${user.name}`))
  // 將響應(yīng)加載為 JSON
  .then(response => response.json())
  // 顯示頭像圖片(githubUser.avatar_url)3 秒(也可以加上動畫效果)
  .then(githubUser => {
    let img = document.createElement('img');
    img.src = githubUser.avatar_url;
    img.className = "promise-avatar-example";
    document.body.append(img);
    setTimeout(() => img.remove(), 3000); // (*)
  });

這段代碼可以工作,具體細(xì)節(jié)請看注釋。但是,這兒有一個潛在的問題,一個新手使用 promise 的典型問題。

請看 (*) 行:如何能在頭像顯示結(jié)束并被移除 之后 做點什么?例如,想顯示一個用于編輯該用戶或者其他內(nèi)容的表單。就目前而言,是做不到的。

為了使鏈可擴(kuò)展,需要返回一個在頭像顯示結(jié)束時進(jìn)行 resolve 的 promise。

就像這樣:

fetch('/article/promise-chaining/user.json')
  .then(response => response.json())
  .then(user => fetch(`https://api.github.com/users/${user.name}`))
  .then(response => response.json())
  .then(githubUser => new Promise(function(resolve, reject) { // (*)
    let img = document.createElement('img');
    img.src = githubUser.avatar_url;
    img.className = "promise-avatar-example";
    document.body.append(img);
    setTimeout(() => {
      img.remove();
      resolve(githubUser); // (**)
    }, 3000);
  }))
  // 3 秒后觸發(fā)
  .then(githubUser => alert(`Finished showing ${githubUser.name}`));

圖片

注:

也就是說,第 (*) 行的 .then 處理程序(handler)現(xiàn)在返回一個 new Promise,只有在 setTimeout 中的 resolve(githubUser) (**) 被調(diào)用后才會變?yōu)?settled。鏈中的下一個 .then 將一直等待這一時刻的到來。

作為一個好的做法,異步行為應(yīng)該始終返回一個 promise。這樣就可以使得之后計劃后續(xù)的行為成為可能。即使現(xiàn)在不打算對鏈進(jìn)行擴(kuò)展,但之后可能會需要。

三、總結(jié)

本文基于JavaScript基礎(chǔ),介紹了Promise 鏈的高級用法,主要介紹了使用Promise時新手常會出現(xiàn)的幾個問題,對這幾個問題進(jìn)行詳細(xì)的解答。

通過案例的分析,能夠更直觀的展示。采用JavaScript語言,能夠幫助你更好的學(xué)習(xí)JavaScript。

代碼很簡單。希望能夠幫助你更好的學(xué)習(xí)。

責(zé)任編輯:華軒 來源: 前端進(jìn)階學(xué)習(xí)交流
相關(guān)推薦

2021-08-10 09:57:27

JavaScriptPromise 前端

2015-07-23 11:59:27

JavascriptPromise

2022-07-03 08:06:40

JavaScript語言代碼

2021-02-07 22:59:55

JavaScript編程方法鏈

2021-09-04 07:56:44

Pythonos模塊

2011-05-25 14:23:55

Javascriptthis

2023-09-15 15:31:23

異步編程Promise

2021-10-09 07:10:30

JavaScriptBigIn函數(shù)

2021-10-09 07:10:31

JavaScript對象Python

2009-06-17 15:01:07

javascript

2017-03-10 10:16:37

PythonRequests庫

2021-06-07 09:44:10

JavaScript開發(fā)代碼

2022-04-04 09:12:18

Python內(nèi)置函數(shù)

2011-05-12 18:26:08

Javascript作用域

2022-10-11 23:50:43

JavaScript編程Promise

2025-03-26 10:56:54

2021-08-31 10:01:04

JavaScript函數(shù)屬性

2021-09-03 10:00:00

JavaScript迭代對象

2021-07-16 07:57:35

JavaScriptEval函數(shù)

2024-11-14 13:15:22

JavaScript可迭代數(shù)組
點贊
收藏

51CTO技術(shù)棧公眾號

一区二区三区在线观看www| 亚洲五月天综合| 亚洲aⅴ日韩av电影在线观看 | 欧美日韩国产在线观看| 美女扒开大腿让男人桶| 日韩精品欧美成人高清一区二区| 91在线高清免费观看| 日韩在线理论| 国产精品自拍偷拍视频| a级网站在线观看| 三级久久三级久久久| 久久精品国产精品国产精品污 | 伊人夜夜躁av伊人久久| 色悠悠久久综合网| 91豆花视频在线播放| 在线精品视频一区二区| 欧美日韩免费做爰大片| 亚洲午夜久久久久久久久电影网| 高清孕妇孕交╳╳交| 亚洲人成7777| 中文字幕国产在线| 欧美一a一片一级一片| 婷婷激情在线| 精品噜噜噜噜久久久久久久久试看| 黄色在线免费看| 欧美日韩亚洲一区| 国产精品欧美激情| av中文一区| 99热最新在线| 日韩av成人高清| 成年人视频网站免费| 久久新电视剧免费观看| xxxx69视频| 91cn在线观看| 国产黄色小视频在线| 亚洲成人激情图| 日本中文字幕一区二区| 免费在线观看麻豆视频| 成a人片亚洲日本久久| 97在线免费观看视频| 日韩中文字幕视频在线| 天堂地址在线www| 中文字幕日韩欧美一区二区三区| 久久精品无码中文字幕| 久久国产66| 蜜桃麻豆www久久国产精品| 一区二区中文| 久久精品国产免费| 国产精品美乳在线观看| 亚洲亚洲一区二区三区| 欧美一区二区三区成人| 日本欧美日韩| 亚洲超丰满肉感bbw| 欧美日韩亚洲一区二| 97国产suv精品一区二区62| 香蕉视频在线观看网站| 亚洲一级二级三级在线免费观看| 精品久久一二三| 亚洲欧美精品午睡沙发| 欧美日韩一区二区三区四区| 免费女人黄页| 日本精品视频网站| 日韩视频免费看| 日本综合在线| 夜夜嗨av色综合久久久综合网| 伦理一区二区| 欧美一二三四五区| 不卡一区二区中文字幕| 亚洲一本大道| 99精品视频网| 一区二区三区四区免费观看| 综合激情成人伊人| 日本高清在线观看视频| 国产91精品青草社区| 久久亚洲风情| 亚洲色图 在线视频| 日韩欧美黄色影院| 欧美激情网址| 自拍另类欧美| 色综合久久综合中文综合网| 亚洲福利影视| 色婷婷av久久久久久久| 天堂av最新在线| 国产成人精品日本亚洲专区61| 蜜臀va亚洲va欧美va天堂| 久久.com| 中文字幕亚洲情99在线| 中文字幕午夜精品一区二区三区| heyzo亚洲| 91精品国产综合久久精品图片| 日本久久伊人| 一区二区精品在线观看| 国产不卡一区| 亚洲精品一区二区三区四区五区| 亚洲国产精品久久人人爱| 不卡av影片| 久久久久高清| 亚洲午夜久久久久中文字幕久| 国产精品成人国产| 欧美激情第六页| 一区二区三区四区中文字幕| 国产福利亚洲| 一本色道久久综合亚洲二区三区| 色综合久久99| 国产日产精品_国产精品毛片| 欧美又粗又长又爽做受| 国产欧美日韩一区二区三区四区| 日本熟妇人妻xxxx| 亚洲电影第1页| 一区二区久久| 欧美日韩国产综合视频| 国产成人自拍视频在线观看| 国产日韩成人精品| 久久久免费人体| 国产日韩欧美大片| 亚洲白拍色综合图区| 亚洲福利久久| 美女做暖暖视频免费在线观看全部网址91| 2018日韩中文字幕| 日本蜜桃在线观看视频| 日韩aⅴ视频一区二区三区| 欧美综合天天夜夜久久| 欧美一区三区| 亚洲永久精品免费| 国产成人精品电影久久久| 国产精品久久一级| 北条麻妃在线一区二区免费播放 | 不卡av一区二区| 岛国毛片在线播放| 久久久噜噜噜久久久| 国产网站一区二区三区| 视频一区中文字幕精品| 激情网站五月天| 美女久久久久久久| 欧美经典三级视频一区二区三区| 91国产一区| 五月婷婷开心综合| 国产成人精品a视频一区www| 精品国产成人在线| 天堂中文在线视频| 8x拔播拔播x8国产精品| 自拍偷拍亚洲激情| 国产一区二区三区四区五区传媒| 性生大片免费观看性| 成人精品视频99在线观看免费| 欧美日韩国产色视频| 一区二区三区午夜探花| 尤物在线视频| 亚洲欧美日本国产有色| 少妇久久久久久| 亚洲视频香蕉人妖| 亚洲精品99| 成人福利片网站| 亚洲成人精品视频在线观看| 日韩午夜高潮| 中文字幕在线直播| 91av在线免费播放| 日本国产一区二区三区| 欧美中文字幕一区二区三区| 免费一级欧美片在线观看| 日本a人精品| av三级在线播放| 日韩av电影免费播放| 亚洲偷欧美偷国内偷| 一区在线观看免费| 狠狠入ady亚洲精品| 91免费版网站在线观看| 日韩三级电影网址| 成人黄页毛片网站| 一区二区三区韩国免费中文网站| 爱久久·www| 久久这里只有精品18| 国产精品扒开腿做| 精品久久国产字幕高潮| 久久精品视频免费| 欧美三级第一页| 99久久er| 一本大道香蕉8中文在线视频| 伊人情人网综合| 热久久这里只有精品| 欧美成va人片在线观看| 国产精品久久久久久久久久辛辛 | 欧美激情免费| 欧美精品卡一卡二| 国产精品视频1区| 亚洲精品97久久| 亚洲猫色日本管| 欧美bbbbb| 国产一区三区在线播放| 18video性欧美19sex高清| 色乱码一区二区三区在线| 欧美日韩国产三区| 97成人超碰免| 亚洲精品wwwww| 亚洲免费在线视频一区 二区| 按摩亚洲人久久| 亚洲小说欧美另类社区| 欧美日韩伦理一区二区| 自拍视频在线| 黄色手机在线视频|