Nodejs如何使用函数的回调结果

Nodejs how to use the callback result of a function

本文关键字:回调 结果 函数 何使用 Nodejs      更新时间:2023-09-26

我正在通过编写一个应用程序来管理我的飞利浦色相灯来学习nodejs,我对nodejs的工作方式有一个问题。

我有一个函数,应该得到所有的灯的id:

id = [];
function getLightsId() {
    args = {
        path: {
            "username": "myusername"
        }
    };
    client.registerMethod("getLightState", "http://192.168.0.10/api/${username}/lights/", "GET");
    client.methods.getLightState(args, function (data, response) {
        for (key in data) {
            id.push(key);
        }
    });
}

问题是,每当我想使用我的id数组,它是空的,因为nodejs没有处理getLightsId回调函数。

ps:我正在使用node-rest-client与我的API交互

它正确地处理了你的回调,只是函数是异步的。这意味着当您稍后尝试使用id变量时,它仍在处理上述回调。你需要传递另一个回调,并将id变量传递给它,一旦它被填充:

function getLightsId(callback){
    args ={
        path:{"username":"myusername"}
    };
    client.registerMethod("getLightState", "http://192.168.0.10/api/${username}/lights/", "GET");
    client.methods.getLightState(args, function(data,response){
        var id = [];
        for(key in data){
            id.push(key);
        }
        callback(id);
    });
}

你可以这样调用它:

getLightsId(function(idArray) {
    console.log(idArray); //here they are
});

另一种方法是使用promises库,如 promises -io,这只是避免"回调地狱"的方法之一。

var Deferred = require('promised-io/promise').Deferred;
id = [];
function getLightsId() {
    var deferred = new Deffered;
    args = {
        path: {
            "username": "myusername"
        }
    };
    client.registerMethod("getLightState", "http://192.168.0.10/api/${username}/lights/", "GET");
    client.methods.getLightState(args, function (data, response) {
        for (key in data) {
            id.push(key);
        }
        deferred.resolve();
    });
    return deferred.promise;
}
getLightsId().then(function(){
    // Now you have the id[]s
});