Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs如何使用函数的回调结果_Javascript_Node.js - Fatal编程技术网

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

Javascript Nodejs如何使用函数的回调结果,javascript,node.js,Javascript,Node.js,我正在通过编写一个应用程序来管理我的飞利浦色调灯来学习nodejs,我对nodejs的工作方式有一个问题 我有一个函数,可以获取所有灯光的ID: id = []; function getLightsId() { args = { path: { "username": "myusername" } }; client.registerMethod("getLightState", "http://192.168

我正在通过编写一个应用程序来管理我的飞利浦色调灯来学习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客户端与我的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
});

它处理了你的回调,只是函数是异步的。这意味着当您稍后尝试使用
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
});

另一种方法是使用承诺库,比如,这只是避免“回调地狱”的方法之一


另一种方法是使用承诺库,比如,这只是避免“回调地狱”的方法之一


这与nodejs无关,这是一个javascript问题。它适用于所有异步进程。这与nodejs无关,这是一个javascript问题。它适用于所有异步进程。好吧,我只想将我的id存储在一个数组中,这样我就可以在其他函数中轻松使用该数组。@user3473514,那么这对你来说就行了,我将你的
id
数组保留在全局范围内,当承诺得到解决时(我在此处注释),你就可以访问它了。嗯,我只想将我的id存储在一个数组中,这样我就可以轻松地在其他函数中使用这个数组。@user3473514,那么这对你来说就行了,我把你的
id
数组放在全局范围内,你可以在承诺得到解决时访问它(我在这里评论)。