Асинхронный код во вложенном цикле forEach - нативная реакция - PullRequest
0 голосов
/ 22 января 2019

У меня есть входные данные, отформатированные следующим образом:

[ [4, 1, 2], [2, 5] ]

Я хочу сделать вызов API для каждого из чисел в массиве и вывести его следующим образом:

[ [response_4, response_1, response_2], [response_2, response_5] ]

Я застрял в этой логике в течение двух дней - я не могу правильно отформатировать свой возвращаемый массив.Вместо этого он возвращает:

[ response_4, response_1, response _2, response_2, response_5 ]

Я знаю, что делаю что-то не так с точки зрения использования обещаний / асинхронности, а также знаю, что в какой-то момент мне нужно сбросить temp до length = 0, но каждый раз ядобавьте, что он просто вернет [] как мой вывод.Любой совет / помощь?

const getNumData = (data) => {
  let temp = []
  return new Promise((resolve, reject) => {
    data.forEach((outerArray) => {
      return new Promise((resolve, reject) => {
        outerArray.forEach((number) => {
          return fetch(`http://127.0.0.1:8000/api/number?id=${number}`, {method: 'GET',})
          .then((response) => response.json())
          .then((responseJson) => {
            temp = this.state.seqDone.concat(responseJson[0]);
            this.setState({
              seqDone: temp
            })
            console.log(temp)
          })
        })
        if (this.state.seqDone) {
          console.log(this.state.seqDone)
          resolve(this.state.seqDone);
        } else {
          reject(Error('Sequences not found'));
        }
      })
    });
    if (this.state.seqDone) {
      console.log(this.state.seqDone)
      resolve(this.state.seqDone);
    } else {
      reject(Error('Sequences not found'));
    }
  })
}

Ответы [ 2 ]

0 голосов
/ 22 января 2019
  fetchData = (item) => {
    return fetch(`http://127.0.0.1:8000/api/pose?id=${item}`)
    .then (response => response.json())
  }

  constructArray = (items) => {
    Promise.all(items.map(nestedArray => {
    return Promise.all(nestedArray.map(this.fetchData))
    }
  ))
  .then((results) => {
    console.log(JSON.stringify(results))
  })

  }
0 голосов
/ 22 января 2019

Вы можете сделать это таким образом

const nestedPromise = async (items = []) => {
  return await Promise.all(
    items.map(async item => {
      if (Array.isArray(item) && item.length) {
        return await nestedPromise(item)
      }
      // return await call to your function
      return 'response-' + item
    })
  )
}

const items = [ [4, 1, 2], [2, 5] ]
nestedPromise(items).then(results => {
  console.log(results)
})

Promise.all принимает массив функций в качестве аргументов, эти функции будут выполняться асинхронно. В вашем случае вы просто должны использовать его рекурсивно

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