我对来自vb.net背景的nodejs完全陌生。我看过很多使用回调的示例,但是我不明白。非常抱歉,如果这是非常基本的。
我正在编写一个AWS Lambda函数,并尝试从AWS IOT Thing Shadow获取值并将其分配给变量。但是我无法使其正常工作,但是日志确实显示已返回该值。我知道它与同步/异步做,只是失去了情节如何得到它。这是到目前为止的代码:
//determine doorstate
function getdoorstate() {
//ask the thing
var currentstate;
var paramsGet = {
"thingName": "garagedoor1",
};
iotData.getThingShadow(paramsGet, function (err, data) {
if (err) {
console.log("Error : " + err, err.stack);
} else {
console.log(data.payload);
var obj = JSON.parse(data.payload);
currentstate=obj["state"]["reported"]["doorstate"];
console.log("The function doorstate is: "+currentstate);
}
});
}
var doorstate = getdoorstate();
日志显示控制台写得很好(假设它们在检索数据后发生):
INFO {"state":{"desired":{"doorstate":0,"transitstate":0},"reported":{"doorstate":0,"transitstate":0}},"metadata":{"desired":{"doorstate":{"timestamp":1591241517},"transitstate":{"timestamp":1591241517}},"reported":{"doorstate":{"timestamp":1591241517},"transitstate":{"timestamp":1591241517}}},"version":444,"timestamp":1591241860}
The function doorstate is: 0
但是返回的值是:undefined
任何人都可以建议如何更改我的代码以正确使用回调。简单点-我是新手!谢谢!
Sagar建议的更新代码-仍然存在
//determine doorstate
function getdoorstate() {
//ask the thing
var paramsGet = {
"thingName": "garagedoor1",
};
iotData.getThingShadow(paramsGet, function (err, data) {
if (err) {
console.log("Error : " + err, err.stack);
} else {
callback(data)
}
});
}
getdoorstate(function (value){
console.log(value);
});
var doorstate = getdoorstate();
我又怎么了?
如果直接调用getdoorState函数,则它具有异步操作,用于提取物联网的过程将在后台,它将开始执行下一行。
因此,当您直接调用getdoorstate()时,它将始终返回未定义。您需要等待api调用才能使用callback,promises或async await限制数据
您可以尝试这样的事情
// using call back
function getdoorstate(callback) {
//ask the thing
iotData.getThingShadow(paramsGet, function (err, data) {
if (err) {
console.log("Error : " + err, err.stack);
} else {
callback(data)
}
});
}
getdoorstate(function (value){
console.log(value)
// Access value here
});
// Below line won't work
var value = getdoorstate()
// using promises
function getdoorstate(callback) {
return new Promise((resolve, reject) => {
//ask the thing
iotData.getThingShadow(paramsGet, function (err, data) {
if (err)
reject(err)
else
resolve(data)
});
}
})
getdoorstate()
.then(data => {
console.log(data)
})
.catch(err=>{
console.log(data)
})
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句