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

问题描述 投票:0回答:1

我对来自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

任何人都可以建议如何更改我的代码以正确使用回调。简单点-我是新手!谢谢!

node.js function lambda callback iot
1个回答
0
投票

getdoorState函数具有异步操作,如果您直接调用它,则将在后台获取iot的过程将在后台运行,并将开始执行下一行。

所以当您直接调用getdoorstate()时,它将始终返回未定义。您需要等待api调用,才能使用callbackpromises或异步等待

您可以尝试这样的事情

// 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)
 })
© www.soinside.com 2019 - 2024. All rights reserved.