收藏
回答

云函数中调用axios,怎么让数据同步?

我在云函数内调用axios查询阿里云数据,查询到后怎么让数据保持同步?代码如下:

主函数查询代码如下:

console.log('Start')

          const res = await queryDevicePropertyStatus("a1FGCXEvXEE", list.data[i].deviceid)

          

            console.log("Success1")

console.log(res//查看返回response数据

            console.log(res.Data//查看返回response数据


函数如下:

async function queryDevicePropertyStatus(productKey, deviceName) {

  const aliSdk = require("aliIot-sdk.js");

  return await aliSdk.request({

    Action: "QueryDevicePropertyStatus",

    ProductKey: "a1FGCXEvXEE",

    DeviceName: deviceName

  }, {

    method: "POST"

  },

  (res) => {

    console.log("Success")

    console.log(res.Data//查看返回response数据

  },

  (res) => {

    console.log("fail")

  },

  (res) => {

    console.log("complete")

  })

调用的axios代码部分如下:

//封装request

const request = (params, opts, success, fail, complete) => {

  

  if (method === 'POST'{

    opts.headers = opts.headers || {};

    opts.headers['content-type'= 'application/x-www-form-urlencoded'

    opts.data = canonicalize(normalized)

  }

  axios({

    url: url,

    data: opts.data ? opts.data : {},

    header: opts.headers,

    method: 'POST',

    dataType: 'json',

    responseType: 'json'

  }).then((res) => {

    if (typeof success === 'function'{

      success(res.data);

    } else {

      console.log("success is not a function");

    }

  })

}

调试记录如下:

[info] 函数被触发,正在执行中...

index.js:70 Start

index.js:73 Success1

index.js:74 undefined

node.js:1 [error] 函数执行失败(耗时 1015ms) TypeError: Cannot read properties of undefined (reading 'Data')

    at d.exports.main [as handler] (D:\Downloads\Nodemcu\wechat_onenet\wechat_onenet_ZZJALY\cloudfunctions\timer\index.js:75:29)

    at processTicksAndRejections (node:internal/process/task_queues:96:5)

node.js:1 [info] 调用 本地 云函数 'timer' 完成  (耗时 1018ms)

index.js:168 Success

index.js:169 {List: {…}}

我希望数据能同步运行,就是打印Start完了后,能打印Success,但是程序不等待数据,就直接运行到Success1了,并且打印res显示undefined。

还请懂的帮我看一下,多谢!

回答关注问题邀请回答
收藏

1 个回答

  • CRMEB
    CRMEB
    2023-10-24

    你可以尝试将`queryDevicePropertyStatus`函数的调用放在一个Promise中,这样主函数就可以等待数据同步。修改后的代码如下:


    async function main() {
      console.log('Start');
      const res = await Promise.all(list.data.map(item => queryDevicePropertyStatus("a1FGCXEvXEE", item.deviceid)));
      console.log("Success1");
      console.log(res); //查看返回response数据
    }
    


    这里使用了`Promise.all`来确保所有的`queryDevicePropertyStatus`函数调用都完成后再继续执行。这样你就可以在打印"Success1"之前等待数据同步了。

    2023-10-24
    有用
    回复
登录 后发表内容