0

I've searched around a lot, but I just can't grasp the fundamentals of returning data from an ajax call's success method. I'm normally ruby dev, and fully understanding js/coffeescript's best practices have been a hurdle.

I have a CS file that does something like this:

$ ->
  $.when(Foo.load()).done (data) ->
  # manipulate data

But this "data" comes from either a cached object in the browser, or an ajax call's successful response. Here's some info on the Foo class

class @Foo
   _now = new Date().getTime()
   _expiration = new Date(_now).setHours(24, 0, 0, 0) #24 hours from now

  @save: (data) ->
    record = { value: JSON.stringify data, timestamp: _expiration }
    localStorage.setItem('responseData', JSON.stringify record)

  @load : ->
   record = JSON.parse localStorage.getItem('responseData')
   if record and _now < record.timestamp
     JSON.parse record.value
   else
     Foo.refresh()

  @refresh : ->
    $.ajax(
      url: '/data'
      dataType: 'JSON'
      type: 'post'
      async: false
      success: (data) ->
        Foo.save data.results
    )
    Foo.load()

The problem stems from the load and refresh methods. As you can see, we can result in an infinite loop. load calls refresh which will call load which will call refresh and so on.

What I am looking for is a way to return the response from the ajax method in the load() method, so it performs the same way as the JSON.parse record.value

if record and _now < record.timestamp
     JSON.parse record.value
else
  # RETURN the result of the successful ajax call, this would mean that when we call $.when(Foo.load()).done we would have waited for the ajax call to run.

If anyone has any tips, they would be much appreciated! I will gladly elaborate as needed.

Would the ajax call async attribute have anything to do with it? I was thinking it was the behavior of the 2 class methods in Foo

jimmycouch
  • 108
  • 9

0 Answers0