Paginate されたコンテンツを処理する

Paginate されたコンテンツを必要な分だけ取ってくる、みたいな javascript + jQuery の code snippet です。特に面白いものではないです。

function get_recursive(gen_url, proc, need_more, cont, acc) {
  var aux = function(acc, count) {
    // 変な need_more 渡されて延々と回されても困る
    if (count == GET_RECURSIVE_LIMIT) {
      cont(acc);
      return;
    }

    $.get(gen_url(acc), function(html) {
      acc = proc(html, acc);
      if (need_more(acc)) {
        aux(acc, count + 1);
      } else {
        cont(acc);
      }
    });
  }

  aux(acc, 0);
}

これはプリミティブすぎなので実際にはターゲットにあわせて色々します。というわけで雰囲気だけの適当なコード例。

process_data: function(cont) {
  var acc_seed = {
    page_num: 0,
    data:     [],
  };

  var gen_url = function(acc) {
    return URL + '/' + acc.page_num;
  };

  var proc = function(html, acc) {
    var data = nanika_syori_suru(html);
    return {
      page_num: acc.page_num + 1,
      data:     acc.data.concat(data),
    };
  };

  var prev_data_length = 0;
  var need_more = function(acc) {
    if (prev_data_length == acc.data.length)
      return false;
    prev_data_length = acc.data.length;
    return nanika_hantei_suru(acc.data);
  };

  var cont_wrapper = function(acc) {
    cont(acc.data);
  };

  get_recursive(gen_url, proc, need_more, cont_wrapper, acc_seed);
}

エラー処理とか必要な場合はもうちょっと面倒な感じになると思いますが、こんなもんでしょう。おしまい。結論とかはない。あるとすれば javascript なんて書きたくない。