我在云函数内调用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。
还请懂的帮我看一下,多谢!
你可以尝试将`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"之前等待数据同步了。