【问题标题】:Asynchronous code in nested forEach loop- react native嵌套 forEach 循环中的异步代码 - 反应原生
【发布时间】:2019-01-21 22:20:13
【问题描述】:

我输入的数据格式如下:

[ [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 ]

我知道我在使用 Promise/async 方面做错了,而且我知道我需要在某个时候将 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'));
    }
  })
}

【问题讨论】:

    标签: javascript react-native asynchronous foreach


    【解决方案1】:

    你可以这样做

    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 接受函数数组作为参数,这些函数将异步执行。在你的情况下,你只需要递归地使用它

    【讨论】:

    • 感谢您的帮助。我最终做了类似的事情
    • 很高兴听到您找到了解决方案。你认为这可能是正确的答案吗?如果可以的话,你能把它标记为正确的吗?
    【解决方案2】:
      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))
      })
    
      }
    

    【讨论】:

    • 这是我最终采用的解决方案
    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2020-06-29
    • 2016-06-17
    • 2018-03-06
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多