【问题标题】:Looping thorough an array to make axios calls循环遍历数组以进行 axios 调用
【发布时间】:2018-10-27 00:05:55
【问题描述】:

我正在调用 API 以使所有设备都连接到我的本地服务器。然后我试图遍历所有连接的设备并进行更多调用以获取一些数据。我将如何循环遍历所有设备,而不仅仅是数组中的第一个?

这是我存储在设备变量中的响应

[{"connected":true,"functions":["SetGain","SetIntegTime","SetInterrupt","Enable","begin"],"id":"1f0039000547363339343638","last_app":null ,"last_heard":"2018-10-26T16:01:34.974Z","last_ip_address":"::ffff:10.10.10.5","name":"actually-jail","platform_id":6,"product_firmware_version ":65535,"product_id":6,"status":"normal","variables":{"RawData":"string","ColorTemp":"string","Lux":"string","SensorArray" :"string","Gain":"string","IntegraTime":"string","TemperatureC":"double","TemperatureF":"double","TemperatureK":"double","TemperatureR":" double"}},{"connected":false,"functions":null,"id":"3a003a001047363333343437","last_app":null,"status":"normal","variables":null}]

async function getDevices() {
      let devices = await  axios('http://10.10.10.1:8080/v1/devices/?access_token=687b5aee0b82f653c725570422dea5d37de6b65f')
      return this.devices = (devices.data[0].id)};


async function getVariables() {

  try {
    const devices = await getDevices();
    console.log(devices);
    const RawDataPromise = axios(API + devices + '/RawData/?access_token=' + Token);
    const ColorTempPromise = axios(API + devices + '/ColorTemp/?access_token=' + Token);
    const LuxPromise = axios(API + devices + '/Lux/?access_token=' + Token);
    const SensorArrayPromise = axios(API + devices + '/SensorArray/?access_token=' + Token);
    const GainPromise = axios(API + devices + '/Gain/?access_token=' + Token);
    const IntegraTimePromise = axios(API + devices + '/IntegraTime/?access_token=' + Token);
    const TemperatureCPromise = axios(API + devices + '/TemperatureC/?access_token=' + Token);
    const TemperatureFPromise = axios(API + devices + '/TemperatureF/?access_token=' + Token);
    const TemperatureKPromise = axios(API + devices + '/TemperatureK/?access_token=' + Token);
    const TemperatureRPromise = axios(API + devices + '/TemperatureR/?access_token=' + Token);
    const [RawData, ColorTemp, Lux, SensorArray, Gain, IntegraTime, TemperatureC, TemperatureF, TemperatureK, TemperatureR] = await Promise.all([RawDataPromise, ColorTempPromise, LuxPromise, SensorArrayPromise,GainPromise,IntegraTimePromise,TemperatureCPromise,TemperatureFPromise,TemperatureKPromise,TemperatureRPromise]);
    console.log(RawData.data.result, ColorTemp.data.result,Lux.data.result,SensorArray.data.result,Gain.data.result,IntegraTime.data.result,TemperatureC.data.result,TemperatureF.data.result,TemperatureK.data.result,TemperatureR.data.result);
  } catch (e) {
    console.error(e)
  }
}
getVariables();

【问题讨论】:

  • 看起来你正在使用Promise.all 对,你现在得到什么样的结果?另外,只是一个建议,为了保持干燥,您可以将 API + devices'?access_token=' + Token 放入一个变量中
  • 我能够从阵列中取出第一个设备,因为我硬编码 ~return this.devices = (devices.data[0].id)};~ 但我想为所有数组中的设备不仅仅是第一个条目。

标签: javascript node.js async-await axios


【解决方案1】:

创建一个用于从单个设备获取值的包装函数,然后使用 Promise.all(或 Promise.map/each,如果使用 bluebird)多次调用它;

async function getDevices() {
  let devices = await  axios('http://10.10.10.1:8080/v1/devices/?access_token=687b5aee0b82f653c725570422dea5d37de6b65f');

  return this.devices = (devices.data)
};

async function getForOneDevice(device) {
    // I've assumed here that 'devices' in your API calls was a typo, and was intended to be devices[0] (based on the question)
    const RawDataPromise = axios(API + device + '/RawData/?access_token=' + Token);
    const ColorTempPromise = axios(API + device + '/ColorTemp/?access_token=' + Token);
    const LuxPromise = axios(API + device + '/Lux/?access_token=' + Token);
    const SensorArrayPromise = axios(API + device + '/SensorArray/?access_token=' + Token);
    const GainPromise = axios(API + devices + '/Gain/?access_token=' + Token);
    const IntegraTimePromise = axios(API + device + '/IntegraTime/?access_token=' + Token);
    const TemperatureCPromise = axios(API + device + '/TemperatureC/?access_token=' + Token);
    const TemperatureFPromise = axios(API + device + '/TemperatureF/?access_token=' + Token);
    const TemperatureKPromise = axios(API + device + '/TemperatureK/?access_token=' + Token);
    const TemperatureRPromise = axios(API + device + '/TemperatureR/?access_token=' + Token);
    return Promise.all([RawDataPromise, ColorTempPromise, LuxPromise, SensorArrayPromise,GainPromise,IntegraTimePromise,TemperatureCPromise,TemperatureFPromise,TemperatureKPromise,TemperatureRPromise]);
}

async function getVariables() {
    try {
        const devices = await getDevices();
        console.log(devices);

        const promises = [];
        devices.forEach((device) => {
            promises.push(getForOneDevice(device.id));
        })

        const allResults = Promise.all(promises);
    } catch (e) {
        console.error(e)
    }
}

getVariables();

【讨论】:

  • devices.forEach((device) => { promises.push(getForOneDevice(device.id)); }) 没有遇到错误我添加了存储在 devices 变量中的响应
  • 错误是什么?我一直在手机上输入代码,所以可能打错了
  • 我的一个光子没有安装正确的固件,所以它没有连接。一切正常,现在应该感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 2017-12-10
相关资源
最近更新 更多