【问题标题】:Parse JSON file failed in JavaScript在 JavaScript 中解析 JSON 文件失败
【发布时间】:2017-07-27 23:56:53
【问题描述】:

我正在尝试访问类型(标记了下方方块)但没有成功

我的代码位于开头(当我检查长度时):

Object.data.ServiceData.modelObjects.length;

(例如我想获取modelObjects对象的长度)

我得到了按摩:

错误:angular.js:13920 TypeError:无法读取属性“modelObjects” 未定义的

我就是这样使用它的:

function _getIds() {
    var path = vm.package.path;

    var SERVER_PATH = Config.SERVER_PATH;
    return $q(function (resolve, reject) {
        $http.post(SERVER_PATH + '/getLastGetRelated', { path: vm.package.path })
            .then(
            function (success) {
                resolve(success);
            },
            function (err) {
                reject(err);
            })
    });
}   


this.camera = function() {
    _getIds().then(function(ids){
    console.log(Object.ServiceData.modelObjects.length);
    readJson(ids);
    })
}

【问题讨论】:

  • 注意到上面有Object.ServiceDataObject.data.ServiceData,哪个是正确的名称?
  • 你正在为已经返回承诺的东西创建承诺,只需返回$http.post()。此外,您的数据在ids 中,而不是在Object 中,这意味着您将使用ids.ServiceData.modelObject。您的第一个线索应该是您甚至还没有定义一个名为 Object 的变量
  • 这和解析 JSON 有关系吗?

标签: angularjs json node.js


【解决方案1】:

这可能不是问题的答案,但我想指出一件事。 http 默认返回响应作为承诺。但是在这里手动创建承诺以捕获已经承诺的响应。这是不必要的。只需返回 http 请求,而无需像这样创建新的 Promise

function _getIds() {
    var path = vm.package.path;
    var SERVER_PATH = Config.SERVER_PATH;
    return $http.post(SERVER_PATH + '/getLastGetRelated', {
        path: vm.package.path
    })
}
this.camera = function() {
    _getIds().then(function(ids) {
        console.log(Object.ServiceData.modelObjects.length);
        readJson(ids);
    })
}

【讨论】:

    【解决方案2】:

    我的代码位于开头(当我检查长度时):

    Object.data.ServiceData.modelObjects.length;
    

    [...]

    console.log(Object.ServiceData.modelObjects.length);
    

    实际上,您正在检查:

    Object.ServiceData.modelObjects.length
    

    而不是:

    Object.data.ServiceData.modelObjects.length;
    

    查看数据外观的最简单方法是临时更改:

    console.log(Object.ServiceData.modelObjects.length);
    

    到:

    console.log(JSON.stringify(Object));
    

    但请记住,Object 是 JavaScript 中的内置函数(实际上是构造函数),因此它不太可能包含您的数据。

    还有,这个:

    return $q(function (resolve, reject) {
                $http.post(SERVER_PATH + '/getLastGetRelated', { path: vm.package.path })
                    .then(
                    function (success) {
                        resolve(success);
                    },
                    function (err) {
                        reject(err);
                    })
    

    可以写成:

    return $http.post(SERVER_PATH + '/getLastGetRelated', { path: vm.package.path });
    

    一般建议:

    现在,如果您不希望程序在访问可能存在或不存在的属性时崩溃,您可以使用:

    console.log(Object && Object.data && Object.data.ServiceData
        && Object.data.ServiceData.modelObjects
        && Object.data.ServiceData.modelObjects.length);
    

    或使用 lodash:

    console.log(_.get(Object, 'data.ServiceData.modelObjects.length'));
    

    或使用 hoek:

    console.log(hoek.reach(Object, 'data.ServiceData.modelObjects.length'));
    

    见:

    总之,您的代码存在很多问题。你很可能对 Promise 的工作原理、你得到什么数据、在哪个变量中以及如何访问你需要的部分感到困惑。

    我的建议是阅读有关 Promise 的更多信息,检查从 API 获得的数据,并从头开始仔细编写代码。不幸的是,没有人能够像现在这样以表格的形式为您修复该代码,因为我们不知道您的数据是什么样子以及您究竟想用它做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      相关资源
      最近更新 更多