Как проверить, было ли обещание Javascript выполнено, отклонено или решено

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

Если вы сбросите обещание в консоли, вы увидите, что оно покажет 2 «свойства» PromiseStatus а также PromiseValue:

Javascript статус обещания

Однако, если вы попытаетесь получить доступ к этим свойствам с помощью Javascript, вы увидите, что эти значения undefined,

Временное решение

Как и в исходных спецификациях API Promises, стандартного способа доступа к внутреннему состоянию обещания не существует, вы все равно можете обойти это, создав очень простую оболочку, которая изменит Promise и добавит несколько полезных методов.

Следующая оболочка основана на ответе этого вопроса в переполнении стека. Функция ожидает обещание, которое необходимо изменить, затем она возвращает измененное обещание с 3 дополнительными методами, isPending, isRejected а также isFulfilled, Прежде чем приступить к работе с этим обходным путем, мы хотим объяснить вам простой способ концепции всех состояний обещания. Обещание должно быть в одном из этих трех состояний:

Исполненная

Выполнено — это состояние Обещания. Это означает, что обещание было выполнено и теперь имеет свое разрешенное значение (с использованием внутреннего resolve функция). Операция, представленная обещанием, была успешно завершена.

Отклонено

Отклонено означает, что обещание было отклонено и теперь имеет причину отклонения (с использованием внутреннего reject функция). Операция, представленная обещанием, не смогла получить значение и, следовательно, имеет причину, по которой это не удалось сделать (обычно это код ошибки или объект ошибки, но это может быть что угодно).

в ожидании

Pending — начальное состояние обещания. Операция, представленная обещанием, еще не была выполнена или отклонена.

Зная это, давайте начнем:

/**
* This function allow you to modify a JS Promise by adding some status properties.
* Based on: http://stackoverflow.com/questions/21485545/is-there-a-way-to-tell-if-an-es6-promise-is-fulfilled-rejected-resolved
* But modified according to the specs of promises : https://promisesaplus.com/
*/
function MakeQuerablePromise(promise) {
// Don't modify any promise that has been already modified.
if (promise.isResolved) return promise;
// Set initial state
var isPending = true;
var isRejected = false;
var isFulfilled = false;
// Observe the promise, saving the fulfillment in a closure scope.
var result = promise.then(
function(v) {
isFulfilled = true;
isPending = false;
return v;
},
function(e) {
isRejected = true;
isPending = false;
throw e;
}
);
result.isFulfilled = function() { return isFulfilled; };
result.isPending = function() { return isPending; };
result.isRejected = function() { return isRejected; };
return result;
}

Помните, что метод возвращает обещание, которое вы указали в качестве первого параметра, но изменили.

использование

Чтобы понять, как MakeQuerablePromise Метод работает, проанализируйте следующий пример:

// Your promise won't cast the .then function but the returned by MakeQuerablePromise
var originalPromise = new Promise(function(resolve,reject){
setTimeout(function(){
resolve("Yeah !");
},10000);
});
var myPromise = MakeQuerablePromise(originalPromise);
console.log("Initial fulfilled:", myPromise.isFulfilled());//false
console.log("Initial rejected:", myPromise.isRejected());//false
console.log("Initial pending:", myPromise.isPending());//true
myPromise.then(function(data){
console.log(data); // "Yeah !"
console.log("Final fulfilled:", myPromise.isFulfilled());//true
console.log("Final rejected:", myPromise.isRejected());//false
console.log("Final pending:", myPromise.isPending());//false
});

Если вы не хотите создавать дополнительную переменную для исходного обещания, укажите это обещание непосредственно в качестве первого параметра:

var myPromise = MakeQuerablePromise(new Promise(function(resolve,reject){
setTimeout(function(){
resolve("Yeah !");
},10000);
}));
console.log("Initial fulfilled:", myPromise.isFulfilled());
console.log("Initial rejected:", myPromise.isRejected());
console.log("Initial pending:", myPromise.isPending());
myPromise.then(function(data){
console.log(data); // "Yeah !"
console.log("Final fulfilled:", myPromise.isFulfilled());
console.log("Final rejected:", myPromise.isRejected());
console.log("Final pending:", myPromise.isPending());
});

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

Ссылка на основную публикацию
Adblock
detector