В этом примере реализация Promise, зачем проверять, есть ли у резольвера .then? - PullRequest
0 голосов
/ 30 октября 2018

Чтобы закрепить моё понимание 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 охватывает это?

...