Создание вспомогательного метода с помощью jquery / json / getJSON - PullRequest
1 голос
/ 14 апреля 2011

Я хотел создать вспомогательный метод, который может содержаться во включенном JavaScript и ссылаться на него легко.Вспомогательный метод переносит функцию .getJSON из jquery ...

function doSomething(someThing) { 
  $.getJSON(theCoolestURLEver, {auth_key:"barfoo", id:someThing}, function(data) {
   console.log(data);
   return data;
  });
}

На моих обычных HTML-страницах я хочу сделать следующее:

<html>
<head>
   <script src="/_/js/myCoolFunctions.js"></script>
</head>
<body>
<script>
  var someThing = "foobar";
  var data = doSomething(someThing);
  console.log(data);
</script>
</body>
</html>

Конечный результат заключается в том, чтоconsole.log возвращается как неопределенный во втором блоке кода.Теперь я понимаю, что это связано с областью действия или с тем, что страница загружается, а данные недоступны при загрузке тега .Итак ... если это правда, как мне создать вспомогательный метод, который может скрыть некоторую сложность, которая возникает ВСЕГДА?Как добавление auth_key ...

Ответы [ 3 ]

4 голосов
/ 14 апреля 2011

Проблема в том, что запросы AJAX (такие как $.getJSON) асинхронные . Это означает, что вызов функции возвращается немедленно, прежде чем запрос будет завершен. Вы предоставляете обратный вызов - эта функция запускается после получения данных; это будет после console.log.

(В качестве дополнительной точки, return устанавливает только возвращаемое значение обработчика, а не функцию doSomething.)

Наилучшим способом решения этой проблемы было бы, я думаю, создание собственного вспомогательного метода:

$.getJSONAuth = function(url, data, success) {
    var authData =  {auth_key:"barfoo"};

    if ($.type(data) === 'function') {
        success = data;
        data = authData;
    } else {
        data = $.extend({}, authData, data);
    }

    return $.ajax({
        url: url,
        type: 'GET',
        dataType: 'json',
        success: success,
        data: data
    });
}

Теперь вы можете назвать это так:

$.getJSONAuth(theCoolestURLEver, {id:someThing}, function(data) {
    console.log(data);
});
1 голос
/ 14 апреля 2011

Ваша функция doSomething ничего не возвращает, функция обратного вызова getJSON делает. getJSON выполняется асинхронно, поэтому ваша функция doSomething заканчивается до завершения запроса. Однако вы можете передать функцию в функцию doSomething:

function doSomething(someThing, callback) { 
  $.getJSON(theCoolestURLEver, {auth_key:"barfoo", id:someThing}, function(data) {
   callback(data)
   return data;
  });
}

И назовите это так:

<script>
  var someThing = "foobar";
  doSomething(someThing, function(data) { console.log(data); });
</script>
0 голосов
/ 14 апреля 2011

Что делать, если вы делаете:

$.getJSON(theCoolestURLEver, {'auth_key:"barfoo"', 'id:someThing'}, function(data)

Обратите внимание на символы ', окружающие клавиши json.Я не знаю, но это то, как я это сделал.

...