Понимание обещаний JavaScript для абсолютных новичков.

Если вы работали с серверными платформами, такими как Node.js, вы, должно быть, испытывали боль при работе с асинхронным кодом, особенно когда в вашем приложении слишком много I / O в нем. Чтобы справиться с асинхронным кодом, на картинке появляются обратные вызовы и обещания. Поскольку работа с функциями обратного вызова лишь усугубляет проблемы разработчика, обещания становятся более многообещающими для того, чтобы заставить код вести себя синхронным образом. В этой статье мы попытаемся разобраться в обещаниях как можно проще. Прежде всего, что такое обещание на самом деле? Официальная документация обещания гласит, что: -

Объект Promise представляет окончательное завершение (или сбой) асинхронной операции и ее результирующее значение.

Как указано в приведенном выше заявлении, после того, как асинхронная операция будет полностью обработана, у нас останутся два события: успех / сбой или более широко известный как разрешить / отклонить. Мы можем установить наш требуемый ответ в событии разрешения и запустить событие отклонения в случае какой-либо ошибки / исключения. Давайте углубимся в код, чтобы лучше понять суть вещей.

'use strict'
var promise = new Promise((resolve,reject) => {
  
    resolve('Promises are meant to be broken.');
  
});
console.log(promise);

В проиллюстрированном выше примере мы использовали конструктор обещаний в соответствии с синтаксисом ES6, и он вернет два события, то есть разрешение / отклонение. Здесь мы разрешаем простую строку и после этого записываем обещание. Вот что вы получите в качестве результата -

Как видите, наше обещание было выполнено, но для получения его значения нам нужно использовать методы .then () /. Catch ().

'use strict'
var promise = new Promise((resolve,reject) => {
  
    resolve('Promises are meant to be broken.');
  
});
promise.then((result) => {
  
    console.log(result);
  
}).catch((error) => {
  
    console.log(error);
  
})

Теперь, используя .then () и. catch (), мы можем вернуть значение вызванного обработчика, то есть разрешить / отклонить. Теперь мы можем получить желаемый результат следующим образом:

Простой? Не правда ли? Теперь давайте посмотрим, как мы можем работать с несколькими обещаниями. Рассмотрим два обещания обещание1 и обещание2, оба разрешают некоторый асинхронный код и перенастраивают данные. Нам нужно решить оба из них и получить желаемый результат. Давайте посмотрим, как -

'use strict'
var promise1 = new Promise((resolve, reject) => {
  
    resolve('Inside Promise 1.');
  
});
var promise2 = new Promise((resolve, reject) => {
  
    resolve('Inside Promise 2.');
  
});

Promise.all([promise1, promise2])
    .then((result) => {
  
        console.log(result);
  
    }).catch((error) => {
  
        console.log(error);
  
    })

Здесь у нас есть два обещания обещание1 и обещание2, оба возвращающие строку соответственно. Чтобы решить их за один раз, мы используем метод Promise.all () и задаем массив обещаний в качестве аргумента. Обратите внимание, что даже если одно обещание было отклонено, метод Promise.all () напрямую переведет нас в блок .catch (). Это гарантирует, что все обещания работают нормально, и помогает при устранении ошибок, когда возникает необходимость. Это вернет следующий результат -

Теперь давайте пойдем дальше и попробуем разрешить одно обещание внутри другого. Примите во внимание следующий пример -

'use strict'

// First Promise
var promise1 = new Promise((resolve, reject) => {
    var a = 15;
  
    var b = 5;
  
    var c = a + b;
  
    //Resolving the sum obtained.
    resolve(c);
  
});

// Second Promise
var promise2 = new Promise((resolve, reject) => {
  
    var x = 5;
  
    var sum = null;
  
    // Obtaining the value returned by first promise.
    promise1.then((result) => {
      
        sum = result + x;
      
        resolve(sum);
      
    });
});

// Obtaining the sum returned by second promise.
promise2.then((finalResult) => {
  
    console.log(finalResult);
  
}).catch((error) => {
  
    console.log(error);
  
})

В показанном выше примере у нас есть два обещания, то есть обещание1 и обещание2. В обещании1 мы выполняем простой расчет сложения и передаем результат в событие resolve. Теперь в обещании2 мы разрешаем обещание1 и получаем его значение, например 20, и выполняем еще вычисление перед передачей окончательного результата. в событие resolve для обещания2. Наконец, мы можем использовать метод .then () для получения окончательного вывода, то есть -

Таким образом, мы можем получить четкое представление о том, что делать с несколькими обещаниями. Но в реальных приложениях мы просто не хотим играть с числами, верно? Нам необходимо использовать REST Apis, чтобы наши приложения продолжали работать, поэтому давайте посмотрим, как мы можем использовать GET API и разрешить его ответ.

'use strict'
fetch('https://jsonplaceholder.typicode.com/posts')
    .then(res => {
  
        res.json()
  
            .then((data) => {
          
                console.log(data);
          
            })
  
    }).catch((error) => {
  
        console.log(error);
  
    })

В приведенном выше примере мы используем общедоступный GET api и встроенный в JavaScript метод fetch. для этого. Сам метод выборки возвращает обещание по завершении запроса. Поэтому мы получаем его ответ с помощью переменной res. Теперь мы хотим получить данные в формате JSON с помощью метода res.json (), который, в свою очередь, возвращает другое обещание. Обещание, возвращаемое res.json (), может быть разрешено с помощью метода .then () и получения окончательного результата в переменной data. Вывод для указанного выше кода будет следующим:

Как видите, он возвращает массив данных, которые вы можете использовать в своем приложении. А как насчет блока .catch ()? Мы еще не тестировали это. Давайте сделаем ошибку, чтобы проверить это.

'use strict'
fetch('https://jsonplaceholdertypicode.com/posts')
    .then(res => {
  
        res.json()
  
            .then((data) => {
          
                console.log(data);
          
            })
  
    }).catch((error) => {
  
        console.log('Checking for error - ', error);
  
    })

Заметили, что мы здесь сделали? Мы просто настроили наш URL-адрес API так, чтобы точка (.) была удалена перед typicode, что делает его недействительным url, конечно. Итак, давайте проверим это и посмотрим, что мы получим взамен.

Видеть? мы пробились к блоку .catch (), используя недопустимый URL-адрес API. Таким образом, мы можем узнать об ошибках / исключениях, используя события reject и перехватив возвращенные данные в блоке .catch (). Таким образом, мы можем уменьшить боль, связанную с асинхронным кодом в Node.js, и заставить его работать так, как мы хотим, используя promises. Я надеюсь, что он сработал как ледокол и дал вам хорошее представление о том, как можно использовать обещания, чтобы ваш код работал синхронным образом. Если вы чувствуете, что извлекли пользу из этой статьи, и такие упрощенные статьи должны продолжать появляться, любезно поддержите меня, сделав пожертвование на paypal.me/topcoded. Чтобы прочитать больше таких упрощенных статей, посетите TopCoded. Увидимся, ребята, в следующем. Продолжайте кодировать! Продолжайте обещать! ;)

📝 Прочтите этот рассказ позже в Журнале.

👩‍💻 Просыпайтесь каждое воскресное утро и слушайте самые интересные истории из области технологий, ожидающие вас в вашем почтовом ящике. Прочтите информационный бюллетень« Примечательно в технологиях .