Это можно сделать чуть более аккуратно, используя promises / async / await, хотя вам, возможно, придется переносить вывод JS для совместимости с браузером.
Абстрактный подход можно увидеть в следующем примере.
test = ->
for i in [1,2,3]
await new Promise (resolve, reject) ->
setTimeout ->
console.log(i)
resolve()
, 1000
# run asynchronously
setTimeout test
console.log("async loop is running")
При запуске этого сценария каждое число печатается последовательно с задержкой в 1 секунду между каждым, а затем завершается.
С точки зрения вашего кода, это не так уж и отличается.$.ajax
поддерживает async / await ( guide ), поэтому вы можете изменить метод getNewNotifications
на этот
getNewNotifications: ->
await $.ajax(
url: "/new_notification_check.json"
dataType: "JSON"
method: "GET"
)
и вызов в конструкторе на это:
setTimeout =>
loop
await new Promise (resolve, reject) =>
setTimeout =>
results = await @getNewNotifications()
@handleSuccess(results)
resolve()
, 5000
Это хорошо, потому что устраняет необходимость в обратных вызовах или рекурсии