yandex-ui / noscript

Noscript: JavaScript MVC Framework for building SPA
http://yandex-ui.github.io/noscript/
MIT License
34 stars 22 forks source link

Не гарантируется консистентность перерисовки приложения #658

Open chestozo opened 6 years ago

chestozo commented 6 years ago

Кейс:

Результат (кейс воспроизводится нестабильно, но часто):

Возможные причины: ns.page.go() выглядит схематически так:

ns.page.go = function(url, historyAction) {
    ...

    return ns.page.followRoute(route)
        .then(function() {
            ns.page._setCurrent(route, url);
            ns.page._fillHistory(url, historyAction);

            ...

            return ns.page.startUpdate(route);
        }, triggerPageErrorLoad);
};

После запуска ns.page.go() запускается асинхронное действие - ns.page.followRoute(route). Пока оно не завершится - ns.page хранит своё предыдущее состояние (ns.page.current и ns.page.currentUrl).

При этом, если кто-то запустит ns.page.go() без параметров в этот момент - параметры будут скопированы с текущего состояния ns.page - т.е. неактуальные.

В итоге второй вызов ns.page.go() перебивает первый вызов ns.page.go(url1) и получаем неконсистентное состояние приложения.

alexeyten commented 6 years ago

Вообще, если уже запланирован переход, ns.page.go() просто не должен ничего делать. Логично?

chestozo commented 6 years ago

примерно так и хотим сейчас сделать да но есть деталь: текущий update может быть к примеру на стадии отрисовки уже и тогда если мы поменяли данные и хотим ещё раз всё перерисовать посредством ns.page.go() - будет fail..

Epsilonnnn commented 6 years ago

https://github.com/yandex-ui/noscript/pull/659