response-apollo subscribeToMore(previous, subscriptionData) предыдущий фактически не является предыдущим. Те же данные, что и новые входящие данные

Я пытаюсь заставить индикаторы выполнения для пользовательских действий синхронизироваться должным образом со скоростью, с которой сервер может их обработать. Очевидно, что у людей будет небольшая задержка, и я не могу просто предположить, что все одинаковы, и оставить это с фиксированной скоростью. Поэтому я решил просто запустить его в течение 6 секунд (фактическое время действий, без учета задержки), и всякий раз, когда пользователь переходит к следующему действию и снижению его выносливости, он обновляет индикатор выполнения, чтобы начать снова.

Просто для того, чтобы создать образ того, что я делаю: индикатор выполнения перемещается с 0% до 100%, останавливается, и когда начинается следующее действие пользователя, он устанавливается на 0% и снова заполняется через 6 секунд.

Я могу установить setState или подпрограмму внутри, и она будет обновляться каждые 20 миллисекунд, как фактический индикатор выполнения, и вызывать невыносимое отставание, а индикатор выполнения очень нервный.

Моей последней идеей решения было проверить, действительно ли отличались предыдущее состояние и текущее обновление, прежде чем пытаться сбросить индикатор выполнения.

Таким образом, кажется, что предыдущее состояние, которое возвращается, фактически совпадает с "новым" состоянием, которое возвращается при обновлении. Поэтому мне интересно, как вы можете запустить проверку, которая позволит мне сравнить предыдущую отправку с новой подпиской?

Я был бы признателен, если бы кто-то мог помочь или предложить другую (возможно, лучшую!) Альтернативу этой шкале прогресса. Я просто предполагаю, что это один из единственных способов сделать это, кроме создания подписки на сам индикатор выполнения и заставить сервер отправлять ему данные каждые 20 мс, что кажется ужасным по производительности... но я не очень хорошо образован в этом.

before render

  startLoadBar = () => {
    this.timer = setInterval(this.progress, 20);
  };

  progress = () => {
    let elem = document.getElementById("userBar");
    let { progress_bar, updateProgerss } = this.props

    if (100 <= progress_bar) {
      clearInterval(this.timer);
    } else {
      let width = progress_bar + 100 / 300;
      updateProgress(width);
    }
  };  

Внутри заявления о возврате:

  <Query query={STAMINA_FETCH}>
                  {({ subscribeToMore, data, loading, error }) => {
                    if (loading) return <Loader />;
                    if (error) return <p>{/**@todo error*/}</p>;
                    if (!subscribe) {
                      subscribe = subscribeToMore({
                        document: staminaChanged,
                        updateQuery: (prev, { subscriptionData }) => {
                          if (!subscriptionData.data) return prev;
                          const { staminaChanged } = subscriptionData.data;
                          console.log("prev " + JSON.stringify(prev));
                          console.log("staminaChanged " + JSON.stringify(staminaChanged.stamina));
                          if (prev.FETCH_STAMINA.stamina !== staminaChanged.stamina) { //// does nothing since both are exactly the same!
                            this.props.updateProgress(0);
                            this.startLoadBar();
                          }
                          return {
                            ...prev,
                            FETCH_STAMINA: staminaChanged,
                          };
                        }
                      });
                    }

0 ответов

Другие вопросы по тегам