首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从URL数据中获取并转换为JSON数组

从URL数据中获取并转换为JSON数组
EN

Stack Overflow用户
提问于 2018-07-21 07:07:38
回答 1查看 518关注 0票数 0

我有这个功能

代码语言:javascript
复制
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数组。

代码语言:javascript
复制
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时,它运行得很好。

代码语言:javascript
复制
var xx = getJsonObjectFromURL(url, data => {
  return data.server;
});
console.log(xx);

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-21 10:06:31

您的函数getJsonObjectFromURL()不会返回该URL返回的对象。它返回负责https请求代码的对象,这是您不想要的。

我看到您正在使用ES6,所以对您来说最好的解决方案可能是创建一个返回promise的异步函数,这将给您带来很大的灵活性。以下是您的代码的改进版本:

代码语言:javascript
复制
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回调来处理准备好的响应。

代码语言:javascript
复制
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));

同步调用

同步调用强制函数等待结果。你可以这样做:

代码语言:javascript
复制
async function getSync() {
    try {
        // wait for the result
        const data = await getJsonObjectFromURL(url);
        console.log(data.server);
    } catch(err) {
        console.error(err);
    } 
}   
getSync();  

请注意,我们只能在异步函数中使用await关键字。这就是为什么我必须用函数包装同步调用的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51451402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档