我正在通过编写应用来管理我的飞利浦色调灯来学习nodejs,我对nodejs的工作方式有疑问。
我有一个应该得到所有灯光的功能:
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进行交互。
答案 0 :(得分:3)
它处理了你的回调,只是功能异步。这意味着当您稍后尝试使用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
});
答案 1 :(得分:1)
另一种方法是使用promises库,例如promised-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
});