Как ожидать два запроса с Promise.all, а затем вызывать другие функции в обратном вызове? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь дождаться двух запросов. Я получаю данные из базы данных Firebase и устанавливаю их в состояние,

Я хочу после двух запросов Готово, объединяю данные результатов в один массив,

Поэтому я попытался сделать два запроса в массиве sh, а затем использовать

> Promise.all(promises).then(()=>this.updateData());

, но он не работает должным образом, я вижу в консоли updateData(), вызываемой ранее "Код здесь

 fetchOrders = async () => {
         ....
 let promises = [];
    promises.push(
      //  First service orders
      database()
        .ref(
          `Providers/CategoriesOrders/${this.state.serviceName[0] ||
            this.state.serviceStorage[0]}`,
        )
        .on('value', this.ordersCallbackOne),
    );



promises.push(
      // Second service orders
      database()
        .ref(
          `Providers/CategoriesOrders/${this.state.serviceName[1] ||
            this.state.serviceStorage[1]}`,
        )
        .on('value', this.ordersCallbackTwo),
    );

  Promise.all(promises).then(() => this.updateData());
  };



ordersCallbackTwo = snapshot => {
    let orderArr = [];
    snapshot.forEach(childSnapshot => {
      orderArr.push({
        snapshotKey: childSnapshot.key,
        username: childSnapshot.val().username,
      });
    });
    this.setState({orderServiceTwo: orderArr}, () =>
      console.log('2', this.state.orderServiceTwo), // it's log data here
    );
  };

функция, которую я хочу вызвать после двух запросов Готово.

  updateData = () => {
    // if (this.rejectedOrders?.length >= 1) {
    //   const orders = this.state.orders.filter(
    //     order => !this.rejectedOrders.some(key => order.snapshotKey === key),
    //   );
    //   this.setState({orders, loading: false});
    //   return;
    // }

    console.log('ordersOne!', this.state.orderServiceOne); // empty!

    const order1IDs = new Set(
      this.state.orderServiceOne.map(({snapshotKey}) => snapshotKey),
    );
    console.log('order1IDs', order1IDs);
    const combined = [
      ...this.state.orderServiceOne,
      ...this.orderServiceTwo?.filter(
        ({snapshotKey}) => !order1IDs.has(snapshotKey),
      ),
    ];
    console.log('combined', combined);
    this.setState({
      orders: combined,
      loading: false,
    });
  };

1 Ответ

2 голосов
/ 09 апреля 2020

on('value') не возвращает обещание и не будет работать здесь. Он используется только для присоединения слушателя к запросу и будет получать результаты в течение неопределенного времени до вызова off().

Вместо этого следует использовать один раз ('значение') , который выполняет запрос один раз и возвращает обещание после его завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...