首頁 > web前端 > js教程 > 主體

JavaScript 中的 Promise:初學者終極指南

PHPz
發布: 2024-07-28 06:36:23
原創
558 人瀏覽過

Promises in JavaScript: The Ultimate Guide for Beginners

介紹

JavaScript 是一種多功能程式語言,主要用於 Web 開發。 JavaScript 最強大的功能之一是它處理非同步操作的能力。這就是 Promise 發揮作用的地方,它允許開發人員更有效地管理非同步程式碼。本指南將帶您了解 Promise 的基礎知識,提供深入的知識和實際範例,幫助您有效地理解和利用它們。

目錄

標題 副主題
JavaScript 中的 Promise 是什麼? 定義、Promise 狀態、基本語法
創造承諾 範例、解決、拒絕
連鎖承諾 then()、catch()、finally()
處理錯誤 常見陷阱、錯誤處理技術
Promise.all() 用法、範例、處理多個 Promise
Promise.race() 用法、範例、第一個解決的承諾
Promise.any() 用法、範例、第一個履行的承諾
Promise.allSettled() 用法、範例、當所有承諾都解決時
異步/等待 語法、與 Promise 的結合、範例
現實世界的例子 Fetch API,非同步檔案讀取
常見錯誤 反模式,最佳實踐
高級 Promise 概念 自訂 Promise、Promise 組合器
常見問題 回答常見問題
結論 總結,最後的想法

Qu'est-ce qu'une promesse en JavaScript ?

Une promesse en JavaScript est un objet représentant l'achèvement ou l'échec éventuel d'une opération asynchrone. Il vous permet d'associer des gestionnaires à la valeur de réussite éventuelle ou à la raison de l'échec d'une action asynchrone. Cela permet aux méthodes asynchrones de renvoyer des valeurs comme les méthodes synchrones : au lieu de renvoyer immédiatement la valeur finale, la méthode asynchrone renvoie une promesse de fournir la valeur à un moment donné dans le futur.

L'état d'une promesse

Une promesse peut être dans l'un des trois états suivants :

  1. En attente : L'état initial, ni réalisé ni rejeté.
  2. Fulfilled : L'opération s'est terminée avec succès.
  3. Rejeté : L'opération a échoué.

Syntaxe de base d'une promesse

let promise = new Promise(function(resolve, reject) {
    // Asynchronous operation
    let success = true;

    if(success) {
        resolve("Operation successful!");
    } else {
        reject("Operation failed!");
    }
});
登入後複製

Créer une promesse

Créer une promesse implique d'instancier un nouvel objet Promise et de lui transmettre une fonction. Cette fonction prend deux paramètres : résoudre et rejeter.

Exemple

let myPromise = new Promise((resolve, reject) => {
    let condition = true;
    if(condition) {
        resolve("Promise resolved successfully!");
    } else {
        reject("Promise rejected.");
    }
});

myPromise.then((message) => {
    console.log(message);
}).catch((message) => {
    console.log(message);
});
登入後複製

Dans cet exemple, myPromise sera résolue avec succès et enregistrera « Promesse résolue avec succès ! » à la console.

Enchaîner les promesses

L'une des caractéristiques puissantes des promesses est la possibilité de les enchaîner. Cela vous permet d'effectuer une séquence d'opérations asynchrones de manière lisible et maintenable.

alors()

La méthode then() est utilisée pour gérer la réalisation d'une promesse.

myPromise.then((message) => {
    console.log(message);
    return "Next step";
}).then((nextMessage) => {
    console.log(nextMessage);
});
登入後複製

attraper()

La méthode catch() est utilisée pour gérer le rejet d'une promesse.

myPromise.then((message) => {
    console.log(message);
}).catch((error) => {
    console.log(error);
});
登入後複製

enfin()

La méthode enfin() est utilisée pour exécuter du code, que la promesse ait été remplie ou rejetée.

myPromise.finally(() => {
    console.log("Promise is settled (either fulfilled or rejected).");
});
登入後複製

Gestion des erreurs

La gestion des erreurs dans les promesses est cruciale pour un code robuste.

Pièges courants

  1. Ignorer les erreurs : gérez toujours les erreurs en utilisant catch().
  2. Oublier de revenir : assurez-vous de renvoyer les promesses dans les gestionnaires then().

Techniques de gestion des erreurs

myPromise.then((message) => {
    console.log(message);
    throw new Error("Something went wrong!");
}).catch((error) => {
    console.error(error.message);
});
登入後複製

Promesse.all()

Promise.all() prend un tableau de promesses et renvoie une seule promesse qui se résout lorsque toutes les promesses du tableau sont résolues, ou qui est rejetée si l'une des promesses est rejetée.

Usage

let promise1 = Promise.resolve(3);
let promise2 = 42;
let promise3 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then((values) => {
    console.log(values); // [3, 42, "foo"]
});
登入後複製

Promesse.race()

Promise.race() renvoie une promesse qui se résout ou se rejette dès que l'une des promesses du tableau est résolue ou rejetée.

Usage

let promise1 = new Promise((resolve, reject) => {
    setTimeout(resolve, 500, 'one');
});
let promise2 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then((value) => {
    console.log(value); // "two"
});
登入後複製

Promesse.any()

Promise.any() renvoie une promesse qui se résout dès que l'une des promesses du tableau se réalise, ou la rejette si toutes les promesses sont rejetées.

Usage

let promise1 = Promise.reject("Error 1");
let promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, "Success"));
let promise3 = new Promise((resolve, reject) => setTimeout(resolve, 200, "Another success"));

Promise.any([promise1, promise2, promise3]).then((value) => {
    console.log(value); // "Success"
}).catch((error) => {
    console.log(error);
});
登入後複製

Promesse.allSettled()

Promise.allSettled() renvoie une promesse qui se résout une fois que toutes les promesses données ont été résolues ou rejetées, avec un tableau d'objets décrivant chacun le résultat de chaque promesse.

Usage

let promise1 = Promise.resolve("Resolved");
let promise2 = Promise.reject("Rejected");

Promise.allSettled([promise1, promise2]).then((results) => {
    results.forEach((result) => console.log(result.status));
});
登入後複製

Asynchrone/Attente

Les mots-clés async et wait vous permettent de travailler avec les promesses de manière plus synchrone.

Syntaxe

async function myFunction() {
    let myPromise = new Promise((resolve, reject) => {
        setTimeout(() => resolve("Done!"), 1000);
    });

    let result = await myPromise; // Wait until the promise resolves
    console.log(result); // "Done!"
}

myFunction();
登入後複製

Combiner avec des promesses

async function fetchData() {
    try {
        let response = await fetch('https://api.example.com/data');
        let data = await response.json();
        console.log(data);
    } catch (error) {
        console.error("Error fetching data: ", error);
    }
}

fetchData();
登入後複製

Exemples concrets

Récupérer l'API

L'API Fetch est un cas d'utilisation courant pour les promesses.

fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
登入後複製

Lecture de fichiers asynchrone

Utilisation des promesses de lecture de fichiers dans Node.js.

const fs = require('fs').promises;

async function readFile() {
    try {
        let content = await fs.readFile('example.txt', 'utf-8');
        console.log(content);
    } catch (error) {
        console.error('Error reading file:', error);
    }
}

readFile();
登入後複製

Erreurs courantes

Anti-modèles

  1. Callback Hell : évitez les appels then() imbriqués.
  2. Ignorer les erreurs : gérez toujours les refus de promesses.

Les meilleures pratiques

  1. Toujours renvoyer les promesses : assurez-vous de renvoyer une promesse dans vos gestionnaires then() et catch().
  2. Utilisez Async/Await : simplifiez la gestion des promesses avec async et wait.

Concepts de promesse avancés

Promesses personnalisées

Vous pouvez créer des promesses personnalisées pour gérer des opérations asynchrones spécifiques.

function customPromiseOperation() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Custom operation complete!");
        }, 2000);
    });
}

customPromiseOperation().then((message) => {
    console.log(message);
});
登入後複製

Combinateurs de promesses

Combinez plusieurs promesses à l'aide de combinateurs comme Promise.all(), Promise.race(), etc., pour gérer des flux asynchrones complexes.

FAQ

Comment les promesses aident-elles avec la programmation asynchrone ?
Les promesses offrent un moyen plus propre et plus lisible de gérer les opérations asynchrones par rapport aux rappels traditionnels, réduisant ainsi le risque de « l'enfer des rappels ».

Quelle est la différence entre then() et `

attraper()?
then() est utilisé pour gérer les promesses résolues, tandis que catch()` est utilisé pour gérer les promesses rejetées.

你可以在較舊的 JavaScript 程式碼中使用 Promise 嗎?
是的,Promise 可以與較舊的 JavaScript 程式碼一起使用,但為了完全相容,您可能需要使用 polyfill。

使用 Promise.all() 有什麼好處?
Promise.all() 讓您可以並行執行多個 Promise 並等待所有這些 Promise 完成,從而更輕鬆地管理多個非同步操作。

async/await 如何改進 Promise 處理?
async/await 語法使非同步程式碼看起來和行為更像同步程式碼,提高了可讀性和可維護性。

如果承諾既沒有得到解決也沒有被拒絕會發生什麼?
如果一個 Promise 既沒有被解決也沒有被拒絕,它就會無限期地保持在待處理狀態。重要的是要確保所有承諾最終得到解決或拒絕,以避免潛在的問題。

結論

Promise 是現代 JavaScript 的基本組成部分,使開發人員能夠更有效率、更易讀地處理非同步操作。透過掌握 Promise,您可以編寫更清晰、更易於維護的程式碼,從而有效地處理非同步程式設計的複雜性。無論您是從 API 獲取資料、讀取檔案還是執行自訂非同步任務,理解 Promise 對於任何 JavaScript 開發人員來說都是至關重要的。

以上是JavaScript 中的 Promise:初學者終極指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!