📜  ES6 |承诺

📅  最后修改于: 2022-05-13 01:56:38.906000             🧑  作者: Mango

ES6 |承诺

Promise 是一种在 JavaScript(ES6,也称为 ECMAScript-6)中实现异步编程的方法。 Promise 充当未来值的容器。就像您从任何站点订购任何食物并将其运送到您的地方一样,该订单记录将是承诺,而食物将是该承诺的价值。所以订单详细信息是您订购的食物的容器。让我们用另一个例子来解释它。您在线订购了一台很棒的相机。下订单后,您会收到订单收据。该收据是您的订单将交付给您的承诺。收据是未来价值的占位符,即相机。在 JavaScript 中用于异步编程的 Promise。对于异步编程,JavaScript 使用回调,但使用回调存在问题,即回调地狱(多个或依赖回调)或末日金字塔。使用 ES6 Promise 将简单地避免与回调相关的所有问题。需要承诺:回调在处理基本案例时非常有用。但是在开发一个有很多代码的 Web 应用程序时。回调可能会带来很大的麻烦。在复杂的情况下,每个回调都会增加一层嵌套,这会使您的代码非常混乱且难以理解。简单来说,代码中有多个回调会增加代码在可读性、可执行性和许多其他方面的复杂性。这种过度嵌套的回调通常被称为回调地狱示例:回调地狱

javascript
f1(function(x){
    f2(x, function(y){
        f3(y, function(z){
            ...
        });
    });
});


javascript
const myPromise = new Promise((resolve, reject) => {
    if (Math.random() > 0) {
        resolve('Hello, I am positive number!');
    }
    reject(new Error('I failed some times'));
})


javascript
var promise = new Promise(function(resolve, reject) {
    resolve('Hello, I am a Promise!');
})
 
promise.then(function(promise_kept_message) {
        console.log(promise_kept_message);
            }, function(error) {   
 
        // This function is invoked this time
        // as the Promise is rejected.
        console.log(error); })


javascript
const myPromise = new Promise((resolve, reject) => {
    if (Math.random() > 0) {
        console.log('resolving the promise ...');
        resolve('Hello, Positive :)');
    }
    reject(new Error('No place for Negative here :('));
});
 
const Fulfilled = (fulfilledValue) => console.log(fulfilledValue);
const Rejected = (error) => console.log(error);
myPromise.then(Fulfilled, Rejected);
 
myPromise.then((fulfilledValue) => {
    console.log(fulfilledValue);
}}).catch(err => console.log(err));


为了解决这个问题,我们使用 Promises 而不是回调。做出承诺:当我们不确定分配的任务是否会完成时,就会创建一个承诺。 Promise 对象表示异步(异步)操作的最终完成(或失败)及其结果值。顾名思义,从现实生活本身来看,Promise 要么被保留,要么被破坏。 Promise 总是处于以下状态之一:

  • 完成:与承诺相关的操作成功。
  • 拒绝:与承诺相关的操作失败。
  • 待处理:承诺仍待处理,即尚未履行或拒绝。
  • 解决:承诺已履行或拒绝

句法:

const promise = new Promise((resolve,reject) => {....}); 

例子:

javascript

const myPromise = new Promise((resolve, reject) => {
    if (Math.random() > 0) {
        resolve('Hello, I am positive number!');
    }
    reject(new Error('I failed some times'));
})

对 Promises 的回调:有两种类型的回调用于处理 Promise .then( ).catch() 。它可用于在履行(承诺被遵守)或拒绝(承诺被破坏)的情况下处理承诺。

  • .then():在遵守或违反承诺时调用。它可以被链接以处理承诺的履行或拒绝。它接受两个函数作为参数。如果 promise 被履行,则调用第一个,如果 promise 被拒绝,则调用第二个(可选)。示例:使用 .then() 处理 Promise 拒绝

javascript

var promise = new Promise(function(resolve, reject) {
    resolve('Hello, I am a Promise!');
})
 
promise.then(function(promise_kept_message) {
        console.log(promise_kept_message);
            }, function(error) {   
 
        // This function is invoked this time
        // as the Promise is rejected.
        console.log(error); })
  • .catch()可用于处理错误(如果有)。它只接受一个函数作为用于处理错误(如果有)的参数。示例:使用 .catch() 处理 Promise 拒绝(或错误)

javascript

const myPromise = new Promise((resolve, reject) => {
    if (Math.random() > 0) {
        console.log('resolving the promise ...');
        resolve('Hello, Positive :)');
    }
    reject(new Error('No place for Negative here :('));
});
 
const Fulfilled = (fulfilledValue) => console.log(fulfilledValue);
const Rejected = (error) => console.log(error);
myPromise.then(Fulfilled, Rejected);
 
myPromise.then((fulfilledValue) => {
    console.log(fulfilledValue);
}}).catch(err => console.log(err));