成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

有了這五個方法,輕松處理異步任務(wù)

開發(fā) 前端
本文我將介紹 Promise 對象上 5 個非常有用的方法,掌握這些方法之后,可以讓你更好地解決工作遇到的一些異步問題。

在 JavaScript 中,許多操作都是異步的,比如發(fā)起網(wǎng)絡(luò)請求、讀取文件、定時器等。Promise 提供了一種更加結(jié)構(gòu)化和易于理解的方式來處理異步操作,使得異步代碼更加清晰易讀,避免了回調(diào)地獄的問題。

本文我將介紹 Promise 對象上 5 個非常有用的方法,掌握這些方法之后,可以讓你更好地解決工作遇到的一些異步問題。

Promise.all()

當(dāng)你需要并行執(zhí)行多個異步操作,并且只有當(dāng)所有異步操作都成功完成時才繼續(xù)執(zhí)行后續(xù)代碼。

const promise1 = Promise.resolve("Promise");
const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, "is");
});
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1000, "useful");
});

Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});

以上代碼成功運行后,控制臺會輸出以下結(jié)果:

[ 'Promise', 'is', 'useful' ]

但如果某個 promise 對象在執(zhí)行過程中拋出異常,比如,promise2 對象在執(zhí)行時拋出異常:

const promise2 = new Promise((resolve, reject) => {
  setTimeout(reject, 2000, new Error("Crash..."));
});

那么,你就無法正常獲取 promise1 和 promise3 對象返回的結(jié)果。針對這個問題,你可以使用 Promise.allSettled() 方法。

Promise.allSettled()

當(dāng)你想要等待多個異步操作完成,并且你需要知道每個異步操作的結(jié)果。

const promise1 = Promise.resolve("Promise");
const promise2 = new Promise((resolve, reject) => {
  setTimeout(reject, 2000, new Error("Crash..."));
});
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1000, "useful");
});

Promise.allSettled([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});

運行以上代碼之后,控制臺會輸出以下結(jié)果。數(shù)組中每個對象上的 status 屬性是用于標(biāo)識對應(yīng) promise 對象的執(zhí)行狀態(tài)。

[
  { status: 'fulfilled', value: 'Promise' },
  {
    status: 'rejected',
    reason: Error: Crash...
  },
  { status: 'fulfilled', value: 'useful' }
]

Promise.race()

當(dāng)你有多個異步操作,并且你只關(guān)心哪個操作最先完成,不管它是成功還是失敗。

const promise1 = new Promise((resolve, reject) => {
  setTimeout(reject, 1000, "Promise 1 resolved");
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, "Promise 2 resolved");
});

Promise.race([promise1, promise2]).then((value) => {
  console.log(value);
});

以上代碼成功運行后,控制臺會輸出 "Promise 1 resolved"。

Promise.any()

當(dāng)你有多個異步操作,并且你想要得到第一個成功的異步操作的結(jié)果,而忽略其他已失敗的異步操作。

const promise1 = Promise.reject("any");
const promise2 = new Promise((resolve) =>
  setTimeout(resolve, 100, "Promise 2 resolved")
);
const promise3 = new Promise((resolve) =>
  setTimeout(resolve, 500, "Promise 3 resolved")
);

Promise.any([promise1, promise2, promise3]).then((value) => {
  console.log(value);
});

以上代碼成功運行后,控制臺會輸出 "Promise 2 resolved"。

Promise.withResolvers()

在某些場景下,我們希望在外部控制 Promise 對象的狀態(tài)。比如,在請求網(wǎng)絡(luò)數(shù)據(jù)的場景,當(dāng)成功接收所有數(shù)據(jù)后,才調(diào)用 resolve 方法設(shè)置當(dāng)前 Promise 的返回數(shù)據(jù)。

let resolve, reject;
const promise = new Promise((res, rej) => {
  resolve = res;
  reject = rej;
});

asyncRequest(config, response => {
  const buffer = [];
  response.on('callback-request', id => {
    promise.then(data => callback(id, data));
  });
  response.on('data', data => buffer.push(data));
  response.on('end', () => resolve(buffer));
  response.on('error', reason => reject(reason));
});

上述的場景在日常工作中很常見,為了避免重復(fù)寫以下代碼。

let resolve, reject;
const promise = new Promise((res, rej) => {
  resolve = res;
  reject = rej;
});

ts39 增加了 proposal-promise-with-resolvers 草案,目前該草案的狀態(tài)已經(jīng)是 Stage 4。不過在使用的過程中,需要注意它的兼容性:

對于不支持 Promise.withResolvers() 方法的環(huán)境,我們可以通過通過自定義函數(shù)來實現(xiàn)對應(yīng)的功能。比如,TypeScript 源碼中,定義了一個 defer 函數(shù)來實現(xiàn) Promise.withResolvers()  方法同樣的功能。

export function defer<T = void>(): Deferred<T> {
    let resolve!: (value: T | PromiseLike<T>) => void;
    let reject!: (reason: unknown) => void;
    const promise = new Promise<T>((_resolve, _reject) => {
        resolve = _resolve;
        reject = _reject;
    });
    return { resolve, reject, promise };
}
責(zé)任編輯:姜華 來源: 全棧修仙之路
相關(guān)推薦

2024-04-16 00:00:00

Spring微服務(wù)架構(gòu)

2010-12-01 14:34:59

AsyncTask異步處理任務(wù)Android

2022-07-22 16:30:25

MacmacOS

2023-03-31 13:01:31

PythonCelery驗證

2022-11-16 09:57:23

優(yōu)化接口

2015-01-23 10:10:46

2020-04-07 00:10:16

javascrip語言異步

2021-06-25 10:20:07

Linux技巧命令

2015-10-29 09:27:33

2023-11-27 19:22:24

Python庫編程語言

2024-03-06 08:13:33

FutureJDKCallable

2021-11-30 08:04:32

AIIT運維

2021-08-12 23:12:13

Windows 10Windows微軟

2021-04-11 07:48:42

定時任務(wù)Linux jdk

2025-06-04 08:55:00

2022-12-23 08:37:16

BigDecimaljava

2020-10-20 18:51:43

C++IDECode

2020-08-17 17:22:34

VSCode插件開發(fā)編碼

2020-12-08 22:05:37

Python編程語言開發(fā)

2011-03-31 13:46:51

點贊
收藏

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

主站蜘蛛池模板: 天天色天天色 | 日本黄色免费视频 | 精品欧美一区二区三区久久久小说 | 国产91丝袜在线播放 | 亚洲系列第一页 | 亚洲成人精品在线观看 | 91在线看| 福利久久 | 国产在线a| 亚洲在线一区二区 | 国产精品久久久久久久久久尿 | 国产日韩91 | 在线视频一区二区三区 | 日日干综合 | 久久久久久久久久久久久久av | 日一区二区 | 亚洲网站在线观看 | 久久福利 | 青青激情网 | 免费av直接看 | 久久精品综合 | 一级毛片视频 | 欧美精品一区在线 | 成人精品一区二区三区中文字幕 | 国产精品成人一区 | 久久久久久久一区二区三区 | 国产亚洲精品美女久久久久久久久久 | 免费在线一区二区三区 | 欧美日韩在线视频一区 | 欧美日韩亚洲系列 | 国产精品一区2区 | 天天综合永久入口 | 欧美性区 | 国产一区亚洲 | 第四色影音先锋 | 国产免费一区二区 | 天堂影院av | 欧美日韩亚洲成人 | 亚洲人成人一区二区在线观看 | 免费一区二区三区在线视频 | 先锋资源站 |