我正在尝试从resp.on函数的get请求中传递数据。我想使用“ var url”发出一个单独的get请求,从中我将再次解析数据。我能够从函数内部进行console.log变量,但不能返回(或从外部进行访问)。这似乎是范围或异步问题。
const https = require('https');
https.get('https://collectionapi.metmuseum.org/public/collection/v1/objects', (resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
var json_data = JSON.parse(data);
var total = json_data.total
var random_objectID = Math.floor(Math.random()*total)
var url = 'https://collectionapi.metmuseum.org/public/collection/v1/objects/' + random_objectID
console.log(url);
});
}).on("error", (err) => {
console.log("Error: " + err.message);
})
//'url' becomes unknown here. I want to pass it to another get request.
答案 0 :(得分:0)
这既是异步问题,也是范围问题!
如果您在最外层的范围内声明var url;
,则可以按预期的那样在该回调中设置它,但是由于这是异步发生的,除非您可以在范围外使用该值回调完成后进行检查。
或者,您可以将整个内容包装在promise中,例如
const https = require('https');
new Promise((resolve,reject)=>{
let targetUrl = 'https://collectionapi.metmuseum.org/public/collection/v1/objects';
https.get(targetUrl,resp=>{
// ...
resp.on('end', () => {
// ...
resolve(url);
});
});
}).then(url=>{
// do stuff with that URL
});
如果您的目标是自动从Web资源中获取数据,我建议您检查一下request module,它也有一个可能的变体。