React Native - проблема с обновлениями состояния для массива внутри объекта в массиве - PullRequest
1 голос
/ 25 апреля 2020

, так как я совершенно новый, чтобы реагировать на нативную, я столкнулся с проблемой с обновлением моего состояния. Я получил в корзине массив корзин, в которых хранится информация о корзине и все элементы, выбранные пользователем для синхронизации c с сервером. Всякий раз, когда я пытаюсь синхронизировать c корзины с моей функцией на сервере, я получаю сообщение об ошибке, что элементы больше не определяются в объекте состояния. Кто-нибудь знает, как это исправить?

Я использую TypeORM локально для сохранения изменений для пользователя, который на самом деле работает, но обновление состояния не работает, массив элементов в корзине после setCarts(newCarts) вызов всегда неопределен. Так как элементы содержат синхронизированную метку времени, я перебираю getSyncState() над ними, чтобы получить син c состояние самой корзины в FlatList.

const syncAllCarts = async () => {
    let tempCarts = carts;
    let newCarts = tempCarts.map(async cart => {
      if (getSyncState(cart) === 0) {
        cart.items = cart.items.map(async item => {
          if (item.state !== 1) {
            postData({
              SiteNumber: item.site.sitenum,
              SiteTitle: item.site.title,
              ArticleNumber: item.article.artnum,
              Quantity: item.quantity,
              Uuid: cart.uuid,
              Scanned: cart.created
            }).then(async (data) => {
              const itemRepo = getRepository(Item);
              const dbItem = await itemRepo.findOne({where: {id: item.id}});
              if (data.status === true) {
                const syncDate = Math.round((new Date()).getTime() / 1000);
                dbItem.state = 1;
                dbItem.synchronized = syncDate;
                item.state = 1;
                item.synchronized = syncDate;
                await itemRepo.save(dbItem);
              } else {
                Alert.alert('Fehler bei der Übertragung', 'Leider ist ein Fehler aufgetreten, prüfen Sie Ihre Verbindung.');
                dbItem.state = -1;
                item.state = -1;
                dbItem.message = typeof response !== 'undefined' ? response.message : 'no connection';
                await itemRepo.save(dbItem);
              }
            }).catch((e) => {
              Alert.alert('Fehler bei der Verbindung', 'Leider ist ein Fehler aufgetreten, prüfen Sie Ihre Verbindung.');
              console.log(e);
            });
          }
          return item;
        })
      }
      return cart;
    });
    setCarts(newCarts);
  }

  const postData = async (data = {}) => {
    const response = await fetch(host + 'post/json', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Token: token,
        cache: 'no-cache',
        redirect: 'follow',
        referrerPolicy: 'no-referrer',
        connection: 'keep-alive'
      },
      body: JSON.stringify(data)
    });
    return await response.json();
  }

const getSyncState = (cart) => {
    let syncState = 1;
    cart.items.forEach((element) => {
      if (element.state !== 1) {
        syncState = 0;
      }
    })
    return syncState;
  }
...