Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Перезапрос моделей в ns.Update #464

Open
doochik opened this issue Sep 17, 2014 · 16 comments
Open

Перезапрос моделей в ns.Update #464

doochik opened this issue Sep 17, 2014 · 16 comments

Comments

@doochik
Copy link
Contributor

doochik commented Sep 17, 2014

Есть такой кейс.

Дано:

  1. запустили апдейт
  2. ушел запрос моделей на сервер
  3. модели получены, все валидны

Т.к. апдейт у нас работает асинхронно, то может произойти какое-то событие между "получили модели" и "начали рисовать", которое инвалидирует часть нужных моделей. Банально, пользователь может куда-то кликнуть и привести к такой реакции. В итоге, получаем отрисовку по error-content.

У нас для этого случая была обработка: если перед отрисовкой не все данные валидны, но запрос за моделями завершился без ошибок (т.е. у моделей статус не error, а invalid), то делаем перезапрос моделей. Такое может повторяться N раз.

Кому-то это интересно?

@doochik
Copy link
Contributor Author

doochik commented Sep 17, 2014

Даже вот более понятный кейс.
Запрашиваем модель m1 и m2. m1 была валидна и запрашивается только m2. В момент запроса m1 была инвалидирована.
ns.request завершился удачно, но к отрисовке мы приходим с невалидной моделью

@edoroshenko
Copy link
Contributor

А мы не хотим сделать, чтобы начиная с момента получения моделей, update у нас был синхронным?

@doochik
Copy link
Contributor Author

doochik commented Sep 17, 2014

получение моделей не может быть синхронной операцией

@edoroshenko
Copy link
Contributor

а ns.request.models разве не проверит после запросов все модели? Может подумать о том, чтобы ns.request.models гарантировал валидность моделей после завершения и сам перезапрашивал, если настал второй кейс? А дальше сделать синхронный update

@doochik
Copy link
Contributor Author

doochik commented Sep 17, 2014

Да, тоже вариант

@doochik
Copy link
Contributor Author

doochik commented Sep 17, 2014

Блин, тогда стадии апдейта переедут куда-то в _requestModels, не красиво (

@chestozo
Copy link
Member

У нас есть update._expired() и он уже где-то используется.
Может нам стоит этот флаг везде (на всех стадиях) проверять и перезапускать update?

@doochik
Copy link
Contributor Author

doochik commented Sep 17, 2014

Кажется, что правильно проверять валидность в районе _updateDOM, т.е. непосредственно перед началом синхронной отрисовки

@chestozo
Copy link
Member

Согласен, перед рендерингом можно проверить, а как отрендерили - уже всё равно.
Не разорвало бы только async update-ы :)

@edoroshenko
Copy link
Contributor

Ну если между sync и async update'ом модельку сломают, то async отрисует errorContent

@doochik
Copy link
Contributor Author

doochik commented Sep 17, 2014

Пробный фикс #466

@doochik
Copy link
Contributor Author

doochik commented Sep 29, 2014

О, я кажись нашел источник всех бед

ns.View.prototype._tryPushToRequest = function() {

....
/*
         Логика должна быть такая: все виды должны себя ВСЕГДА добавлять в ответ, сейчас это делают только невалидные.
         Иначе может получиться странная ситуация:
         Есть вид v1, он зависит от модель m1. Он валиден.
         Есть вид v2, он зависит от модели m2. Он невалиден.

         v1 не сообщает свои модели, а v2 сообщает.
         В ns.Update, а следовательно и в ns.request уходят знания только про m2.

         Допустим, в процессе запроса m2, кто-то инвалидировал модель m1.
         Но про ее необходимость никто не знает,
         соответственно дело нормальным способом дойдет до отрисовки,
         где m1 будет перерисован как error-content (фактически пустым, потому нет данных)
         */
....
}

А еще у нас есть прикольная бага, что из ns.request могут возвращаться модели со статусом invalid.

Ждите PR )

@chestozo
Copy link
Member

Допустим, в процессе запроса m2, кто-то инвалидировал модель m1.

А разве от этого можно как-то защититься?
Если в конце запроса моделей ещё раз проверять, все ли они валидны - можно получить infinite loop.

@doochik
Copy link
Contributor Author

doochik commented Sep 29, 2014

Оно сейчас и так проверяется и есть лимит на перезапрос

@edoroshenko
Copy link
Contributor

Лёш, а вот этот большой комментарий в коде - это суть фикса, который ты собираешься сделать?

@doochik
Copy link
Contributor Author

doochik commented Sep 29, 2014

да

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants