Dojo Xhr запрос нового синтаксиса не загружает данные, как ожидалось

Как видно из заголовка, я использую новый синтаксис dojo для dojo / request / xhr, но, похоже, это не работает и выдает ошибку при загрузке данных, в то время как старый синтаксис с тем же 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: неожиданный токен o в Object.parse (нативный) на l.json ( http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:228:250) в м ( http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:227:277) в j [as handleResponse] ( http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:151:351) по адресу 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 тоже, но это все еще не работает.

Я не могу понять, в чем проблема. Что-то не так с моим кодом или это другая проблема?

Любая помощь будет оценена.

1 ответ

Решение

Вы не предоставили пример того, как выглядит ваш исходный ответ JSON, но я предполагаю, что он не является допустимым JSON.

dojo.xhrGet на самом деле использует eval когда handleAs установлен в "json", который по определению будет более разрешающим, чем строгий анализатор JSON. dojo/requestс другой стороны, использует JSON.parse если доступно, это предполагает, что JSON будет правильно сформирован (например, все ключи - это строки в кавычках, все строки используют двойные кавычки).

Попробуйте вставить один из ваших ответов JSON в http://jsonlint.org/ - если он там не проверяется, то он не будет проверяться с помощью dojo/request,

(Причина dojo.xhrGet использования eval, хотя это потенциально небезопасно, это то, что он был написан до широкого распространения JSON.parse поддержка и ее изменение нарушило бы обратную совместимость - иными словами, даже без переключения API разработчики столкнулись бы с проблемой, с которой вы столкнулись прямо сейчас.)

Изменить: JSON, представленный в вопросе, является действительным и работает как со старым, так и с новым API.

Другие вопросы по тегам