UnhandledPromiseRejectionWarning при использовании Fluture `encaseP` в` fetch`

Позиция мыши отображается на объекте event, полученном обработчиком события mousemove, который вы можете присоединить к окну (пузырьки события):

(function() {
    document.onmousemove = handleMouseMove;
    function handleMouseMove(event) {
        var dot, eventDoc, doc, body, pageX, pageY;

        event = event || window.event; // IE-ism

        // If pageX/Y aren't available and clientX/Y are,
        // calculate pageX/Y - logic taken from jQuery.
        // (This is to support old IE)
        if (event.pageX == null && event.clientX != null) {
            eventDoc = (event.target && event.target.ownerDocument) || document;
            doc = eventDoc.documentElement;
            body = eventDoc.body;

            event.pageX = event.clientX +
              (doc && doc.scrollLeft || body && body.scrollLeft || 0) -
              (doc && doc.clientLeft || body && body.clientLeft || 0);
            event.pageY = event.clientY +
              (doc && doc.scrollTop  || body && body.scrollTop  || 0) -
              (doc && doc.clientTop  || body && body.clientTop  || 0 );
        }

        // Use event.pageX / event.pageY here
    }
})();

(Примечание что тело этого if будет работать только на старом IE.)

Пример выше в действии - он рисует точки при перетаскивании мышью по странице. (Проверено на IE8, IE11, Firefox 30, Chrome 38.)

Если вам действительно нужно решение на основе таймера, вы комбинируете это с некоторыми переменными состояния:

(function() {
    var mousePos;

    document.onmousemove = handleMouseMove;
    setInterval(getMousePosition, 100); // setInterval repeats every X ms

    function handleMouseMove(event) {
        var dot, eventDoc, doc, body, pageX, pageY;

        event = event || window.event; // IE-ism

        // If pageX/Y aren't available and clientX/Y are,
        // calculate pageX/Y - logic taken from jQuery.
        // (This is to support old IE)
        if (event.pageX == null && event.clientX != null) {
            eventDoc = (event.target && event.target.ownerDocument) || document;
            doc = eventDoc.documentElement;
            body = eventDoc.body;

            event.pageX = event.clientX +
              (doc && doc.scrollLeft || body && body.scrollLeft || 0) -
              (doc && doc.clientLeft || body && body.clientLeft || 0);
            event.pageY = event.clientY +
              (doc && doc.scrollTop  || body && body.scrollTop  || 0) -
              (doc && doc.clientTop  || body && body.clientTop  || 0 );
        }

        mousePos = {
            x: event.pageX,
            y: event.pageY
        };
    }
    function getMousePosition() {
        var pos = mousePos;
        if (!pos) {
            // We haven't seen any movement yet
        }
        else {
            // Use pos.x and pos.y
        }
    }
})();

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

Боковое примечание : Если вы собираетесь делать что-то каждые 100 мс (10 раз / секунду), постарайтесь сохранить фактическую обработку, которую вы выполняете в этой функции очень, очень ограниченно . Это большая работа для браузера, особенно старых Microsoft. Да, на современных компьютерах это не похоже на много, но в браузерах многое происходит ... Итак, например, вы можете отслеживать последнюю позицию, которую вы обработали, и немедленно освободить поручень от обработчика, если позиция hasn ' t изменено.

1
задан jackdbd 15 January 2019 в 22:30
поделиться

1 ответ

Кажется, здесь происходят две вещи:

  1. Функция data.json() не должна быть заключена в tryP, потому что согласно вашему второму не нарушена Например, он возвращает синхронно (нет await). Это приведет к тому, что Fluture вызовет TypeError (потому что он ожидает увидеть Promise, но получает значение JSON). Хотя, зная API выборки, data.json() обычно действительно возвращает обещание, так что, возможно, ваш второй пример не работает, и что-то еще происходит. Что бы это ни было, я подозреваю, что где-то выдается неожиданная Ошибка. Видите ли вы какие-либо другие сообщения об ошибках в вашей консоли, кроме того, который вы опубликовали?
  2. Я провел некоторое тестирование, и это похоже на правду - когда Fluture вызывает успешную ошибку TypeError после успешного завершения encaseP, Похоже, оригинальному Promise удается поймать эту ошибку и вызвать необработанное отклонение. Это похоже на ошибку регрессии в Fluture, и я скоро исправлю ее. В то же время, если мы дойдем до сути того, что выдает вашу ошибку, вы сможете продолжить, не зависимо от указанного исправления.

РЕДАКТИРОВАТЬ: я открыл PR, чтобы исправить второй вопрос: https://github.com/fluture-js/Fluture/pull/310

EDIT2 : Исправление было выпущено под версией 10.3.1. Использование этой версии поможет вам лучше понять, что происходит с проблемой 1.

0
ответ дан Avaq 15 January 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: