node.js中json获取到的变量如何转化为全局变量?

类似这样:

var aaa = 0;
http.get('http://abc.com/api"', function (res) {

var json = '';
res.on('data', function (d) {
    json += d;
});
res.on('end',function(){
    //获取到的数据
    json = JSON.parse(json);
    aaa = json;
});

}).on('error', function (e) {

console.error(e);

});
console.log(aaa);

因为异步返回数据的问题,实际上aaa没有得到json的数据,输出还是0;如何让aaa的输出为json的值呢?

阅读 3.3k
1 个回答

你的问题应该改为异步返回的数据怎么能类同步获取呢...

就像 Promise,所有的数据操作都应该在链中操作。同理,你的异步回调也应该在回调函数中操作

你可以看看 Node.js 实现异步 I/O 操作的流程:

  1. 将参数与回调传入 Node 核心模块
  2. Node 核心模块将传入的参数和回调函数封装成一个请求对象
  3. 将请求对象推入到 I/O 线程池等待结果
  4. (注意,这就是为什么你同步无法获取数据的原因)上层 JavaScript 代码继续执行!
  5. I/O 操作完成后,将结果存储到请求对象的 result 中去并通知上层代码
  6. 每次时间循环的时候检查是否有完成的 I/O 操作,有就将请求对象加入观察者队列,之后当事件处理
  7. 处理 I/O 观察者事件时,取出之前封装在请求对象中的回调对象,执行回调,将 result 当做参数,完成回调

建议,如果你不喜欢这种回调函数的写法,可以使用 ES7 的 Async/Await 语法。

举个?:

async function fn() {
    let aaa = 0;
    let json = '';
    try {
        const res = await http.get('http://abc.com/api"');
        ...
        aaa = res.result;
        console.log(aaa);        
    } catch(err) {
        console.log(`error: ${err}`);
    }
}

这样是不是舒服多了呢 ~ 但是建议选择最新 LTS 版本的 Node.js哦

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题