如何使用回调从node.js函数返回值?

父母

我对来自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调用才能使用callbackpromises或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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章