Javascript 从URL数据获取并转换为JSON数组
我有这个功能Javascript 从URL数据获取并转换为JSON数组,javascript,json,node.js,Javascript,Json,Node.js,我有这个功能 function getJsonObjectFromURL(url, onData) { let chunks = []; return require('https').get(url, res => { res.setEncoding('utf8') .on('data', (chunk) => { chunks.push(chunk); }) .on('end', () => {
function getJsonObjectFromURL(url, onData) {
let chunks = [];
return require('https').get(url, res => {
res.setEncoding('utf8')
.on('data', (chunk) => {
chunks.push(chunk);
})
.on('end', () => {
onData(JSON.parse(chunks.join('')));
});
}).on('error', function(e) {
console.log("Got an error: ", e);
});
}
我还有一个将url数据转换为json数组的脚本
url = https://pu.vk.com/c824502/upload.php?act=do_add&mid=213468131&aid=-14&gid=156603484&hash=7ab9a7e723425f4a6ca08709cbd5ebd0&rhash=ba8f0ec6580a6eafce38349b12ed3789&swfupload=1&api=1&wallphoto=1
getJsonObjectFromURL(url, data => {
console.log(data.server, data.photo, data.hash);
});
当使用console.log时运行良好。但是,当我想从这个脚本变量中创建时,它会给我大量的集合
var xx = getJsonObjectFromURL(url, data => {
return data.server;
});
console.log(xx);
函数getJsonObjectFromURL()不返回URL返回的对象。它返回负责https请求代码的对象,这是您不想要的 我知道您使用的是ES6,所以最好的解决方案可能是创建一个异步函数,该函数返回一个承诺,这将为您提供极大的灵活性。以下是代码的改进版本:
const https = require('https');
async function getJsonObjectFromURL(url) {
return new Promise((resolve, reject) => {
const chunks = [];
try {
https.get(url, res => {
res.setEncoding('utf8')
.on('data', (chunk) => {
chunks.push(chunk);
})
.on('end', () => {
resolve(JSON.parse(chunks.join('')));
});
}).on('error', e => reject(e));
} catch (err) {
reject(err);
}
});
};
此代码允许您同步或异步检索HTTPS url的远程内容
异步调用
正如您已经在代码中所做的那样,您可以使用lambda回调来处理准备就绪的响应
const url = 'https://pu.vk.com/c824502/upload.php?act=do_add&mid=213468131&aid=-14&gid=156603484&hash=7ab9a7e723425f4a6ca08709cbd5ebd0&rhash=ba8f0ec6580a6eafce38349b12ed3789&swfupload=1&api=1&wallphoto=1';
// here we use a lambda callback that handles the response
getJsonObjectFromURL(url)
.then(data => {
console.log(data.server, data.photo, data.hash);
})
.catch(err => console.error(err));
同步呼叫
同步调用强制函数等待结果。这就是你可以做到的:
async function getSync() {
try {
// wait for the result
const data = await getJsonObjectFromURL(url);
console.log(data.server);
} catch(err) {
console.error(err);
}
}
getSync();
请注意,我们只能在异步函数中使用await关键字。这就是为什么我必须用一个函数包装同步调用。但是有console.log,但我想将结果转换为变量,以便在其他函数中使用。在同步调用示例中,“data”变量接收结果。您可以将该变量传递给其他函数。