CoffeeScript :: Я не знаю, зачем возвращать тело функции при использовании ajax - PullRequest
0 голосов
/ 12 марта 2012

Я новичок в Coffeescript, и у меня есть вопрос об Ajax.

jQuery ->
  api = 
    getId: ->
      res  = []
      $.ajax
        dataType: "jsonp"
        url: "http://localhost:3004/videos.json"
        success: (data) =>
          if data
            data.forEach (elem) =>
              embed_id = elem.video_id
              res.push(embed_id)
            console.log res
            return res

Я попробую этот код, затем

console.log res 

вывод

["id1","id2","id3",...] . 

Так что я ожидаю, что api.getId() вернется ["id1","id2","id3",...] Вместо этого я вижу

Object 
  -> abort
    function(a) {...}
  ...
  -> status: 200
  ...
  -> success: function (){...}

в моем окне отладки.

Я хочу вернуть значение ответа.

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Это на самом деле не проблема Coffeescript, а только то, как работают асинхронные запросы.Вы не можете сразу же вернуть результат из вызова XHR, вам нужно определить обратный вызов, который получит результат (или ошибку) после завершения вызова.

Посмотрите, к чему ваш код компилируется (как Javascript).

getId: ->
   ## .. snip ..
   $.ajax ## .. snip ..

У вас есть функция getId, которая возвращает возвращаемое значение $.ajax, которое (согласно спецификации jQuery) является объектом XHR, а не результатом обратного вызова success.Вы можете использовать его для проверки хода выполнения, отмены запроса, установки дополнительных параметров и т. Д.

success: (data) =>
      ## .. snip ..
      return res

Нет смысла возвращать что-либо из обратного вызова XHR.Вам нужно работать с данными прямо здесь, например, помещать их в DOM или вызывать другую функцию, которая делает с ними что-то полезное.

0 голосов
/ 12 марта 2012

Оператор return res находится внутри вызова AJAX.Он не возвращает функцию getId(), но выполняет внутренний обратный вызов AJAX.Вы не можете сделать это так.Вызовы AJAX являются асинхронными, а вы хотите, чтобы они были синхронными.Я бы посоветовал вам сделать что-то вроде этого:

jQuery ->
  api = 
    getId: (callback) ->
      res  = []
      $.ajax
        dataType: "jsonp"
        url: "http://localhost:3004/videos.json"
        success: (data) =>
          if data
            data.forEach (elem) =>
              embed_id = elem.video_id
              res.push(embed_id)
            callback(res)
          else
            callback(null)
        error: =>
          callback(null)

и теперь в коде вы можете использовать

api.getId(function(res) {
  // do something with the result.
});
// some other things

Имейте в виду, что код some other things может (и будет) бытьвызывается перед кодом do something with the result.

Извините за смешивание CoffeeScript с JavaScript, но я не совсем в CoffeeScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...