Написание рекурсивного цикла setTimeout в Coffeescript - PullRequest
4 голосов
/ 09 марта 2012

Я работаю над приложением для потоковой передачи фотографий. По сути, пользователи будут загружать фотографии в папку на моем сервере через FTP, и страница должна обновляться каждый раз, когда новая фотография добавляется без обновления.

Я планирую сделать это с AJAX и методом, предложенным в этой теме: Как проверить, изменилось ли содержимое каталога с помощью PHP? . По сути, я хочу, чтобы на моей странице был цикл, который каждые X секунд делает AJAX-вызов на страницу PHP, которая возвращает MD5-хэш списка каталогов для папки загрузки. Если хэш изменился с момента последнего вызова, другой вызов AJAX получит последний добавленный файл, а jQuery отобразит его на странице.

В ванильном Javascript / jQuery это можно сделать с помощью рекурсивной именованной функции с setTimeout внутри нее. Этот код работает для меня:

function refreshLoop(currentFolderState, refreshRate) {
    // Get the new folder state
    $.get("../ajax/getFolderState.php", function(data) {
        // If it's different than the current state
        if ( data !== currentFolderState ) {
            // Do something
        }
        // If it's the same as the current state
        else {
            // Do nothing
        }
        // After the refresh rate, try again
        setTimeout(function() {
            refreshLoop(data, refreshRate);
        }, refreshRate);
    });
}

// Document Ready
$(function() {

    var refreshRate = 5000;

    // After refresh rate has passed
    setTimeout(function() {
        // Get the starting folder state
        $.get("../ajax/getFolderState.php", function(data) {
            // Kick off the loop
            refreshLoop(data, refreshRate);
        });
    }, refreshRate);

});

Я использую Coffeescript в этом проекте, чтобы узнать, как он работает, так как многие разработчики, похоже, его любят, но я не могу понять, как воспроизвести эту функциональность без использования именованных функций , Может ли кто-нибудь указать мне правильное направление или объяснить, как мне лучше добиться этого эффекта, что легко сделать в Coffeescript?

Ответы [ 4 ]

6 голосов
/ 13 августа 2013

Более краткая версия

do poll = ->
  #do work here
  setTimeout poll, 1000

, которая компилируется в

var poll;
(poll = function() {
  //do work here
  return setTimeout(poll, 1000);
})();
4 голосов
/ 09 марта 2012

Вы можете сделать что-то подобное в CoffeeScript:

refresh_loop = (data, refresh_rate) ->
    #...etc

refresh_rate = 5000
setTimeout((->
    $.get("../ajax/getFolderState.php", (data) ->
        refresh_loop(data, refresh_rate)
), refresh_rate)

Демо: http://jsfiddle.net/ambiguous/ZVTcg/

Если бы ваша функция была меньше, вы могли бы встроить все это так:

refresh_rate = 5000
setTimeout(f = (->
    // real work goes here...
    setTimeout(f, refresh_rate)
), refresh_rate)

Демо: http://jsfiddle.net/ambiguous/XThV6/

Выделение всего этого, вероятно, будет немного уродливым и запутанным в вашем случае, хотя лучше использовать отдельную конструкцию refresh_loop = (data, refresh_rate) -> ....

4 голосов
/ 09 марта 2012

Я не вижу здесь никаких проблем. Все, что вам нужно сделать, это присвоить refreshLoop переменной. Вот прямой перевод вашего кода на CoffeeScript:

    refreshLoop = (currentFolderState, refreshRate) ->
        $.get '../ajax/getFolderState.php', (date) ->
            # ...
            setTimeout (-> refreshLoop(data, refreshRate)), refreshRate

    $ ->
        refreshRate = 5000
        setTimeout (->
            $.get '../ajax/getFolderState.php', (data) ->
                refreshLoop data, refreshRate
        ), refreshRate
2 голосов
/ 09 марта 2012

но я не могу понять, как воспроизвести эту функцию без использование именованных функций.

Вы можете использовать самозапускающуюся анонимную функцию, например:

(function(){
   // do your stuff

   setTimeout(function(){
      arguments.callee();
   }, time);
})();

Здесь arguments.callee относится к самой анонимной функции.

Обратите внимание, что arguments.callee устарела в ES5, хотя в использовании именованной функции нет ничего плохого.

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