【问题标题】:Javascript array returned with elements but when logging length I get zeroJavascript数组与元素一起返回,但在记录长度时我得到零
【发布时间】:2020-02-26 10:50:09
【问题描述】:

尝试使用异步函数从 API 获取值。我需要能够立即访问数组中的值。

componentDidMount() {
    var devices = this.props.navigation.state.params.userInfoState.deviceIds

    async function call_vstat(device, token)  {
        try {
          let response = await fetch(
            'http://app.yatis.io/api/admin/getDeviceStatus?api_access_token=' + token + '&deviceId=' + device,
          );
          let responseJson = await response.json();
          return responseJson;
        } catch (error) {
          console.error(error);
        }
    }


    var results = []
    for (i = 0; i < devices.length; i++) {
        var result = call_vstat(devices[i], my_token)
        .then( (result) => (results.push(result) ) )
    }

    console.log(results.length)
    console.log(results)
}

这是我查看记录器时的问题,我得到一个长度为 21 的数组,但在记录长度本身时它显示为零。

【问题讨论】:

  • 仔细观察你的数组旁边的小 i 按钮,它象征着你的数组值稍后会被评估。由于异步行为,这一点很明显。
  • 如果我需要立即访问数组值,最好的方法是
  • 通过循环 devices.length 并推送 call_vstat(devices[i], my_token) 来创建一系列承诺。然后将它们与Promise.all() 一起解决。如果这能解决您的问题,请告诉我。
  • Sibasish 提到,这是由于异步行为。一旦 array.length 大于 0,您可以添加检查,然后执行所需的业务逻辑。
  • 看看这个Link。易卜拉欣·马里尔的回答

标签: javascript react-native


【解决方案1】:

如果您使用的是async await,则不必使用then()。你能做的就是

for (i = 0; i < devices.length; i++) {
    var result = await call_vstat(devices[i], my_token)
    results.push(result) 
}

希望这可行

【讨论】:

  • 这不是有点慢吗?
  • 为什么慢?
  • 你必须等待每个呼叫一个接一个
【解决方案2】:

正如我在 cmets 中提到的,

    var promiseArray = [];
    for (i = 0; i < devices.length; i++) {
        promiseArray.push(call_vstat(devices[i], my_token));
    }

    var results = await Promise.all(promiseArray);

    if (results.length > 0) {
        //perform your business logic after this check to avoid any errors
    }

【讨论】:

  • 为什么我们需要不必要地同时使用 Promise 和 async。 for 循环中的一个简单等待解决了这个问题
  • 由于所有请求都相似,我更喜欢一次解决它们。有很多方法可以处理这个问题。我找不到关于在哪里使用Promise.all() 的适当文档,但该线程上的第一个答案可能会帮助您解决问题:stackoverflow.com/questions/38180080/when-to-use-promise-all
  • 但是如果其中一个承诺失败了,整个事情都会失败。
猜你喜欢
  • 1970-01-01
  • 2018-12-10
  • 2022-01-02
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 2021-04-06
相关资源
最近更新 更多