Обещание в JavaScript представляет собой возможное завершение (или сбой) асинхронной операции и позволяет вам обрабатывать результат, как только он будет доступен.

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

Обещание имеет три состояния:

  1. Ожидание: начальное состояние, когда выполняется асинхронная операция, а обещание еще не выполнено или не отклонено.
  2. Выполнено: состояние, когда асинхронная операция успешно завершена, и обещание выполнено с результирующим значением.
  3. Отклонено: состояние, когда асинхронная операция столкнулась с ошибкой или сбоем, а обещание отклонено с указанием причины или объекта ошибки.

Вы можете прикрепить обратные вызовы к обещанию, используя метод .then(). Обратные вызовы выполняются, когда обещание выполнено или отклонено. Первый обратный вызов вызывается, когда обещание выполнено, и получает результирующее значение. Второй обратный вызов вызывается, когда обещание отклонено, и получает причину отклонения.

Наш обещанный полифилл для js находится в разработке. Мы пишем функцию под названием myPromise, которая принимает обратные вызовы для разрешения и отклонения и возвращает объект со статусом и кодом для выполнения обещания.

function myPromise(resolver){
    let successList =[];
    let failureList =[];
    let state = "pending";
    let data ;

    function resolve(value){
        if(state == "pending"){
            for(let success of successList){
                success(value)
            }
        }
        state = "resolved";
        data = value;

    }

    function reject(value){
        if(state == "pending"){
            for(let failure of failureList){
                failure(value)
            }
        }
        state = "reject";
        data = value;
        
    }

    setTimeout(()=>{
        try{
            resolver(resolve,reject)
        }catch(err){
            reject(err)

        }
    },0)

    return {
        status:state,
        then: function(onSuccess,onFailure){
            if(state=="pending"){
                successList.push(onSuccess);
                failureList.push(onFailure)
            } else{
                state =="resolved"? onSuccess(data): onFailure(data)
            }
        }
    }
}

let p = new myPromise((resolve, reject) => {
    resolve("hi rahul);
  });
  p.then((data) => console.log(data));

В приведенном выше коде мы используем переменную myPromise и передаем обратный вызов, который принимает функции разрешения и отказа.
Чтобы сделать ее асинхронной, мы используем метод settimeout. Затем мы проверяем состояние состояния и реагируем соответствующим образом.