dojo xhr 请求新语法未按预期加载数据

dojo xhr request new syntax doesn't load data as expected

正如标题所说,我正在为 dojo/request/xhr 使用新的 dojo 语法,但这似乎不起作用,并且在加载数据时抛出错误具有相同 url 的旧语法给出了想要的结果。

这是不能正确加载数据的当前语法:

    this.get = function (url, loadFunc, errorFunc, handleFunc) {
        xhr( url, {
            handleAs: 'json'
        }).then(function(data){
            typeof loadFunc === 'function' ? loadFunc : function () { };
            console.log(url+ " load");
            console.log(data);
        }, function(error){
            typeof errorFunc === 'function' ? errorFunc : function () {  };
            console.log(url+" error");
            console.dir(error);
        }, function(handle){
            typeof handleFunc === 'function' ? handleFunc : function () { };
            console.log(url+" handle");
            console.log(handle);
        });
    };

如您所见,我正在将数据打印到控制台,我得到了正确的数据,但 xhr 请求抛出此错误:

"SyntaxError: Unexpected token o at Object.parse (native) at l.json (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:228:250) at m (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:227:277) at j [as handleResponse] (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:151:351) at XMLHttpRequest.e (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:154:393)"

虽然以下旧语法可以完美运行:

    this.get = function (url, loadFunc, errorFunc, handleFunc) {
      dojo.xhrGet({
            url: url,
            handleAs: 'json',
            load: typeof loadFunc === 'function' ? loadFunc : function () { },
            error: typeof errorFunc === 'function' ? errorFunc : function () { },
            handle: typeof handleFunc === 'function' ? handleFunc : function () { }
        });
    };

编辑:

这是我的 JSON 数据:

{ "assistants" : [ { "assistants" : [ "M 11",
        "M 1"
      ],
    "name" : "M X1"
  },
  { "assistants" : [ "M 2",
        "M 2XX1",
        "M 3"
      ],
    "name" : "M 1"
  },
  { "assistants" : [ "M 2" ],
    "name" : "M 2"
  },
  { "assistants" : [  ],
    "name" : "M 3"
  }
],
"chiefs" : [ { "chief" : "M X1",
    "name" : "M 11"
  },
  { "chief" : "M 11",
    "name" : "M 1"
  },
  { "chief" : "M X1",
    "name" : "M 2"
  },
  { "chief" : "M 744X1",
    "name" : "M 3"
  }
],
"departments" : [ { "assistants" : [ "M 11",
        "M 3",
        "M 21"
      ],
    "chief" : "M X1",
    "email" : "dg@somedomain.com",
    "interim" : [ "M X542",
        "M 4"
      ],
    "members" : [ "M 2",
        "M 3",
        "M 4",
        "M 5",
        "M X24544"
      ],
    "name" : "Dep1",
    "notify" : [ "Dep2",
        "M X2",
        "M 21"
      ],
    "resp" : "M 21",
    "validators" : [ "Dep2",
        "M 2",
        "M 558"
      ]
  },
  { "chief" : "M 1",
    "email" : "admin@somedomain.com",
    "members" : [ "M 11",
        "M 12"
      ],
    "name" : "Dep3",
    "parent" : "Dep1"
  },
  { "chief" : "M 11",
    "email" : "commercial@somedomain.com",
    "members" : [ "M 21",
        "M 22"
      ],
    "name" : "Dep4",
    "parent" : "Dep1"
  }
],
 "orgaTestModel" : { "corporation" : "Corporation Sample",
  "name" : "Orga Sample 7855"
},
"root" : "Dep1"
}

注: 我正在使用 dojo 1.8.1 版本,但我也用 dojo 1.9.2 测试过它,但它仍然不起作用。

我不知道是什么问题。是我的代码有问题还是其他问题?

如有任何帮助,我们将不胜感激。

您没有提供原始 JSON 响应的示例,但我猜它是无效的 JSON。

handleAs 设置为 "json" 时,

dojo.xhrGet 实际上使用 eval,这根据定义比严格的 JSON 解析器更宽松。 dojo/request,另一方面,如果可用,则使用 JSON.parse,它期望 JSON 格式正确(例如,所有键都是带引号的字符串,所有字符串都使用双引号)。

尝试将您的 JSON 回复之一粘贴到 http://jsonlint.org/ - 如果它没有在那里验证,那么它将不会通过 dojo/request.

验证

dojo.xhrGet 使用 eval 的原因是它是在广泛 JSON.parse 支持之前编写的,即使它可能不安全,并且更改它会破坏向后兼容性 -换句话说,即使不切换 API,开发人员也会 运行 解决您现在 运行 遇到的问题。)

编辑:问题中提供的JSON现在有效,并且适用于新旧API。