DOJO xhrGet, как использовать возвращенный объект JSON? - PullRequest
4 голосов
/ 28 октября 2010

Как я могу получить доступ к данным, возвращенным из xhrGet вне самого get? Firebug показывает, что у объекта "json" есть массив с именем results, который хранит объект json из ответа, но когда я пытаюсь получить к нему доступ, он имеет значение null. Итак: как мне получить доступ к полученным данным в последней строке кода?

var json = dojo.xhrGet({
    url :'/disease_web/graphMlDownload/getEdgeInformation/', handleAs:"json",content : {  edgeid : edgeId, graphname:this._canvas.path},
    load:function(response){
        return response;
    }
});
console.log(json.ioArgs);
console.log(json.results);

Ответы [ 2 ]

3 голосов
/ 29 октября 2010

По умолчанию dojo.xhrGet вызывается асинхронно, поэтому console.log (json.results) имеет значение null, так как он запускается сразу после dojo.xhrGet, но до получения ответа от сервера.

var xhrGet = dojo.xhrGet({
        url: "/some_rul",
        handleAs: "json",
        handle: function(response) {
            console.info(2,'response',response);                
            console.info(3,'xhrGet.results[0]',xhrGet.results[0]);
        }
 });
 console.info(1,xhrGet.hasOwnProperty('results')); 

Результат:

1 ложь

2 ответ - ['некоторые данные с сервера']

3 xhrGet.results [0] - те же данные, что и в «ответе», доступ к которым осуществляется через xhrGet

0 голосов
/ 02 ноября 2010

Самый простой способ получить доступ к вашим извлеченным данным JSON - это присвоить их переменной уровня документа в функции загрузки xhrGet:

var fetchedData = null;

function parseResponse() { /* do something meaningful */ }

dojo.xhrGet({
  url: "{{dataUrl}}dojo/LICENSE",
  handleAs: "json",
  preventCache: true,
  load: function(response){
    // save for later
    window.fetchedData = response;

    // do whatever processing we want with the returned data
    parseResponse();
  },
  error: function(error){
    alert("Couldn't fetch your data: " + error);
  }
});

Да, нет. С тех пор я выучил гораздо лучший способ и забыл вернуться и исправить этот ответ, так что он заслуживает понизившихся голосов.

Правильный способ обработки данных, извлеченных из dojo.xhrGet, jQuery.ajax или любой другой асинхронной выборки данных, заключается в написании функции для обработки ее результатов и передаче ее в xhrGet как load аргумент, вот так:

var request = dojo.xhrGet({ url :'/disease_web/graphMlDownload/getEdgeInformation/',
    handleAs: "json",
    content : {edgeid : edgeId, graphname:this._canvas.path},
    load: doSomethingWithMyEdges
});
function doSomethingWithMyEdges(json_results) {
    console.log(json_results);
}
...