我对来自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
任何人都可以建议如何更改我的代码以正确使用回调。简单点-我是新手!谢谢!
getdoorState函数具有异步操作,如果您直接调用它,则将在后台获取iot的过程将在后台运行,并将开始执行下一行。
所以当您直接调用getdoorstate()时,它将始终返回未定义。您需要等待api调用,才能使用callback,promises或异步等待
您可以尝试这样的事情
// using call back
function getdoorstate() {
//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)
});
// 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)
})