Обещание в JavaScript представляет собой возможное завершение (или сбой) асинхронной операции и позволяет вам обрабатывать результат, как только он будет доступен.
Представьте, что у вас есть задача, выполнение которой занимает некоторое время, например получение данных с сервера или чтение файла. Вместо того, чтобы блокировать выполнение вашего кода и ждать завершения задачи, вы можете использовать обещание, чтобы инициировать задачу и продолжить другие операции.
Обещание имеет три состояния:
- Ожидание: начальное состояние, когда выполняется асинхронная операция, а обещание еще не выполнено или не отклонено.
- Выполнено: состояние, когда асинхронная операция успешно завершена, и обещание выполнено с результирующим значением.
- Отклонено: состояние, когда асинхронная операция столкнулась с ошибкой или сбоем, а обещание отклонено с указанием причины или объекта ошибки.
Вы можете прикрепить обратные вызовы к обещанию, используя метод .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. Затем мы проверяем состояние состояния и реагируем соответствующим образом.