如何使用Node.js中asynchronous函数返回的数据?

我想定义一个函数,该函数从GET请求的响应中获取特定ID的列表:

var getList = function (){ var list = []; https.get(options).on('response', function (response) { var body = ''; response.on('data', function (chunk) { body += chunk; }); response.on('end', function () { var obj = JSON.parse(body); for (i=0 ; i<obj.length ; i++){ list.push(obj[i].id); } //console.log(list); //return list; }); }); }; 

现在,我想在其他函数中使用该函数的列表,或者简单地将它分配给一个variables。 我明白,因为函数是asynchronous的(好吧, https.get之一),返回列表并不意味着其他代码不会等待这个函数完成。 我是否必须将所有剩余的代码放在response.end调用中? 我知道我错过了一些非常明显的东西

您可以接受callback作为参数,并使用response.end处理程序中的相关数据调用它:

 var getList = function (successCallback){ var list = []; https.get(options).on('response', function (response) { var body = ''; response.on('data', function (chunk) { body += chunk; }); response.on('end', function () { var obj = JSON.parse(body); for (i=0 ; i<obj.length ; i++){ list.push(obj[i].id); } // invoke the callback and pass the data successCallback(list); }); }); }; 

然后你可以调用getList函数并传入一个callback函数:

 getList(function(data) { // do some stuff with 'data' }); 

当然其他的select是使用一些实现Promise模式的库来避免callback地狱。

使列表成为全局或可访问的

 var list = [] //declare a get method function getUpdatedList(){ return list; } 

如果你在ajax完成之前调用,你会得到null,你会得到实际的数据数组,但在正常情况下只使用callback函数

 function getList(callback){ /// // response.on('end', function () { var obj = JSON.parse(body); for (i=0 ; i<obj.length ; i++){ list.push(obj[i].id); } callback(list); }); }