2014-03-28 74 views
0

我正在通過編寫應用程序來管理我的飛利浦色調燈來學習nodejs,並且我對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 didnt處理getLightsId回調函數。

ps:我正在使用node-rest-client與我的API進行交互。

+0

這有沒有關係的NodeJS,這是一個JavaScript的問題 – Alex

+0

見http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call 。它適用於所有異步進程。 –

回答

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

另一種形式給出是使用一個承諾庫,像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 
}); 
+0

嗯,我只是想將我的id存儲在一個數組中,所以我可以很容易地在其他函數中使用這個數組。 – Jeremie4zw

+0

@ user3473514,那麼這將適用於你,我已經將你的'id'數組留在全局範圍內,並且當promise被解析時(我評論過),你將能夠訪問它。 – Drahcir