выполнять запрос до тех пор, пока элементы не будут отправлены в массив — Реагировать на запрос?

#javascript #reactjs #react-native #react-query

Вопрос:

Я пытаюсь выполнить запрос, когда массив должен быть обновлен, но запрос выполняется немедленно!

Итак, у меня есть checkedProducts массив, в который я вставляю некоторые данные при монтировании экрана, поэтому моя цель-выполнить запрос, когда в этом массиве будут данные.

вот в чем загвоздка

 import {useQuery} from 'react-query';
import {checkAvailableProducts} from '../Api';

export type checkProductItem = {
  product_id: number;
  detail_id: number;
};
export interface checkProducts {
  products: checkProductItem[];
}

export const useCheckAvailableProducts = (products?: checkProducts) => {
  console.log('products-RQ', products);
  return useQuery(
    ['checkAvailableProducts'],
    () => checkAvailableProducts(products),
    {
      enabled: !!products?.products, // OR products?.products.length > 0 not works
    },
  );
};
 

компонент

 ....
  const [checkedProducts, setCheckedProducts] = useState<checkProducts>();
  const {data: unavailableProducts, refetch} = useCheckAvailableProducts(
    checkedProducts,
  );


  React.useEffect(() => {
    if (cartProducts.length) {
      let productsIDs = cartProducts.map(prod => {
        return {
          product_id: prod.id,
          detail_id: prod.detail_id,
        };
      });
      Promise.all(productsIDs).then(allProductsIDs => {
        console.log('allProductsIDs', allProductsIDs);
        return setCheckedProducts({
          products: allProductsIDs,
        });
      });
    }
  }, [cartProducts]);

  React.useEffect(() => {
    const unsubscribe = navigation.addListener('focus', () => {
      refetch();
      console.log('unavailableProducts:', unavailableProducts);
      if (unavailableProducts amp;amp; unavailableProducts.length > 0) {
        console.log('hey if0update!!!');
        updateCart(unavailableProducts);
      }
    });
    // Return the function to unsubscribe from the event so it gets removed on unmount
    return unsubscribe;
  }, [navigation, refetch, unavailableProducts, updateCart]);
 

Комментарии:

1. Что такое cardProducts . Обещание?

2. @testing_22 это массив, который я использовал zustand , поэтому я сохранил корзину там, просто получите их вот так const cartProducts = useCartProduct(state => state.cartProducts);

3. Могу я спросить вас, почему вы Promise.all их? Просто пытаюсь понять твою проблему

4. @testing_22 Я просто жду map(..) завершения итерации , а затем использую Promise.all для установки состояния с разрешенными данными allProductsIDs , если я ошибаюсь, исправьте меня 😉

5. Хорошо. Не уверен. Я имею в виду, если массив состоит из обещаний, поэтому имеет смысл использовать этот метод