我正在开发一个 Node.JS 函数,该函数必须做两件事 - 从API请求一些数据,处理它并将其返回给调用者。
问题是API调用(使用https
模块)是异步的,我的函数在API调用返回数据之前返回。这是我的代码:
const https = require('https');
const options = {
hostname: 'tmp-s.s3.amazonaws.com',
port: 443,
path: '/groups.json',
method: 'GET',
};
const MyHandler = {
handle(handlerInput) {
var group_name;
api_call = function() {
return new Promise( (resolve, reject) => {
req = https.request(options, function(res){
var data = '';
//console.log('statusCode:', res.statusCode);
//console.log('headers:', res.headers);
res.on('data', function(d){ data += d; });
res.on('end', function(){
console.log(data);
var _groups = JSON.parse(data);
var _group_name = _groups[1].name;
console.log("In res.on(): " + _group_name);
resolve(_group_name); // RESOLVE the promise
});
});
req.end();
});
}
api_call().then((value) => {
group_name = value; // I have to return this _value_ from MyHandler.handle()
return group_name; // This returns from the then()-function, not from MyHandler.handle()
});
return group_name; // This returns before group_name is set :(
}
}
// Just for testing - something else calls MyHandler.handle()
console.log("In main(): " + MyHandler.handle("blah"));
以上版画:
In main(): undefined
In res.on(): Group 1
我想要的是反向序列,没有未定义的结果:
In res.on(): Group 1
In main(): Group 1
有人将我之前提出的问题视为This question的副本,但我仍无法使其成功。试图添加Promise
,但仍无法等待handle()
功能完成。我无法控制MyHandler.handle()
的调用者 - 它调用我的函数,我必须返回API调用结果。我无法改变来电者的任何内容。
如果有人可以帮助我使用我的示例代码,而不是将其再次关闭作为远程类似于我无法工作的复制品,我会更喜欢。 请:)
答案 0 :(得分:0)
而是返回group_name
值,在MyHandler.handle
中返回承诺:
return api_call();
然后你必须等待:
MyHandler.handle("blah").then(value => {
console.log(value);
});
我希望它有所帮助:)