Чтобы закрепить моё понимание JavaScript Promise API, я работал над этим прекрасным примером реализации в JavaScript, основанном на этого ответа Stackoverflow .
Тем не менее, я обнаружил, что в полной форме (см. Веб-сайт) было трудно обернуть голову вокруг всех обратных вызовов и упакованных значений. Итак, я сократил его до функциональности, которая не работает с .catch () и не гарантирует, что функция распознавателя (функция, переданная в new Promise(this_function_here)
) не будет вызывать resolve()
более одного раза. Внизу:
const PENDING = 0;
const FULFILLED = 1;
const REJECTED = 2;
function MyPromise(executor) {
let state = PENDING;
let value = null;
let handlers = [];
function fulfill(result) {
state = FULFILLED;
// In the promise website, this result would have been checked]
// before right now to see if it has a .then property, why?
value = result;
handlers.forEach(handle);
handlers = null;
}
function handle(handler) {
if (state === PENDING) {
handlers.push(handler);
} else {
if (state === FULFILLED && typeof handler.onFulfilled === 'function') {
handler.onFulfilled(value);
}
}
}
this.then = function (onFulfilled) {
return new MyPromise(function (resolve) {
setTimeout(function () {
handle({
onFulfilled: function (result) {
return resolve(onFulfilled(result));
}
})
}, 0)
});
}
executor(fulfill);
}
И пример, демонстрирующий интересующую меня функциональность, пока я не смогу лучше понять обработку ошибок:
function fetch_and_callback(resolve) {
setTimeout(() => {
resolve('hello')
}, 1000)
};
const do_async = new MyPromise(fetch_and_callback);
function printer(value) {
console.log('printer coming');
console.log(value);
}
function modifier(result) {
return result + 'has been modified'
}
do_async.then(modifier).then(printer);
Я перестраиваю свой базовый пример так, чтобы он был эквивалентен данному примеру на веб-сайте обещания, однако я не могу понять смысл функции getThen
. Он принимает упакованный «результат» (разрешенное значение) и проверяет, есть ли у него свойство .then. Какой вариант использования это гарантирует? Функция выглядит так:
function getThen(value) {
var t = typeof value;
if (value && (t === 'object' || t === 'function')) {
var then = value.then;
if (typeof then === 'function') {
return then;
}
}
return null;
}
и отправится куда-нибудь до моего комментария в моей функции fulfill
, проверяя, имеет ли аргумент result
свойство .then
.
В примере promisjs реализация Promise, почему реализация проверяет, имеет ли разрешенное значение свойство .then? Какой сценарий использования Promise охватывает это?