Обновить
34
0

Пользователь

Отправить сообщение
Проверил на ноде:
> u = []
> (function(){ var i, a = function(){ var t = setTimeout(function(){ clearTimeout(t); throw 'err' }, 100) }; for (i = 0; i <= 1000; i++) a() })()
// тут err много раз
> u.push(process.memoryUsage())

> u
[ { rss: 22462464, heapTotal: 16702208, heapUsed: 6784336 },
  { rss: 27422720, heapTotal: 17734144, heapUsed: 7669848 },
  { rss: 27914240, heapTotal: 17734144, heapUsed: 8310264 },
  { rss: 28450816, heapTotal: 26122752, heapUsed: 8936288 },
  { rss: 32952320, heapTotal: 26122752, heapUsed: 9413880 } ]

// то же для 
(function(){ var i, a = function(){ var t = setTimeout(function(){ throw 'err' }, 100) }; for (i = 0; i <= 1000; i++) a() })()

> u
[ { rss: 23154688, heapTotal: 16702208, heapUsed: 6874448 },
  { rss: 28086272, heapTotal: 16702208, heapUsed: 7206640 },
  { rss: 28798976, heapTotal: 17734144, heapUsed: 7408280 },
  { rss: 29429760, heapTotal: 26122752, heapUsed: 7655528 },
  { rss: 33726464, heapTotal: 26122752, heapUsed: 7461968 } ]

Я не так что-то делаю?
работа setTimeout после истечения времени будет продолжаться

Почему? В моем комментарии выше есть ссылка на спецификацию. Даже setInterval(function(){throw 'asd'}, 500) сработает только 1 раз.
Объясните, пожалуйста.
Посмотрел, что в спецификации setInterval просто устанавливает следующий таймер после выполнения колбэка (пункт 4.3 здесь www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timer-initialization-steps)
Вопрос был не в разнице. Я просто предположил, что с названием «setInterval» этот таймер должен соблюдать интервалы.
Небольшой пример того, что все можно и с setInterval.
working = false
setInterval ->
  return if working
  working = true
  $.get '/smth', -> working = false
, 200
setInterval не дает желаемого результата?
Impress использует каждый инстанс nodejs для всех приложений? У v8 производительность резко падала раньше при размерах хипа > ~1.5гб. С этим проблем не будет у impress?
Пример с сайта:
Invisible.Person.query({firstName: "Jane"}, function(err, results){
    if (err){
        console.log("something went wrong");
    } else {
        console.log("Persons named Jane are:");
        for (var i = 0; i < results.length; i++){
            console.log(results[i].fullName());
        }
    }
});

Т.е. каждый, кто умеет открывать JS консоль в браузере, может выполнять любые запросы на базе?

Область применения этой библиотеки довольно узкой получается.
Использую capistrano и для деплоя nodejs приложений. Он очень гибкий в конфигурации, так что легко можно создавать любые нужные таски (миграции, прекомпиляцию ассетов и прочие). Также из коробки работает multistage — возможность указывать разные конфиги для development, staging, production.

Таски для работы с forever получились довольно простыми

%w(start restart stop).each do |action|
    task :"forever_#{action}" do
      run "cd #{current_path} && NODE_ENV=#{stage} forever -al #{log_file} #{action} #{forever_cmd}"
    end
  end


С npm install тоже проблем не возникло.

Единственный минус — по умолчанию конфиг лежит в config/deploy.rb, так что если нет у вас этой директории, придется добавить :)
Отличная библиотека! Я так понял, сейчас нельзя добавить свои переводы, т.к. translations — локальная переменная.

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

tempus.translations = gettext // или I18n.t
Класс! doT всё-таки самый быстрый))
MaskJs потом еще появился. Выделяется из всех: jsperf.com/javascript-template-engine-compare/77
Некоторое время назад начал потихоньку дописывать doT, так как из всех существовавших он больше всех привлек. Основной репозиторий был заброшен долгое время, и PR они не принимали.

Позже получилось, что переписал полностью шаблонизатор, оставив основные идеи и скорость ту же. Появилась куча плюшек самых разных: от простой кастомизации тэгов, до прозрачного автолоада, кэширования и препроцессора haml.

Тут можно посмотреть github.com/printercu/doT
Вспомнил только, что документацию последний раз не обновил. Ридми актуален для этого комита github.com/printercu/doT/tree/55d458b79e473b0f6d7009b7d22a5beb08f531e3
github.com/printercu/doT по-мелочи доработок разных добавлял некоторое время. потом переписал основательно. может что приглянится
Я, наверное, непонятно выразился в предыдущем коментарии. Класс — технически это функция. А у любой функции в js .constructor — Function. A Function.prototype (он же .constructor.prototype для класса) перезаписать нельзя, только изменять. Да и то выходит, что он один на все функции.

Во 2м примере вы привели пример изменения прототипа класса. Это всегда было. Я добивался того, чтобы так же можно было поступать с методами класса (статическими, если так будет понятнее). A.classMethod напримерю. Чтобы в унаследованном В, он был доступен по цепочке прототипов, а не собственным свойством.
К сожалению, Function.protoype (ведь это он и есть SomeClass.constructor.prototype) в моей версии node.js доступен только для чтения. Да и в браузере так же. К нему лишь можно добавлять свойства.
Да и если поменять его сначала для одной функции, а потом для другой, то и в первой он поменяется. А кому нужно наследование, которое наследует во все классы сразу.
А extendsWithProto как раз таки добавляет предка только в качестве прототипа одного класса.
Если вы правда знаете, как реализовать для всех движков, поделитесь, пожалуйста. Я буду очень благодарен.

Я добавлю еще один пример работы classkit, если может остались вопросы по его функциям.
describe 'coffee_classkit', ->
  describe '#extendsWithProto', ->
    beforeEach ->
      class @A
        @x = -> true
      class @B extends @A
        classkit.extendsWithProto @

    it 'keeps child`s own properties clean', ->
      assert.deepEqual Object.keys(@A), ['x']
      assert.deepEqual Object.keys(@B), ['__super__']
      assert.equal @A.x(), true
      assert.equal @B.x(), true
Абстракция? Если точнее, были конструкторы и их прототипы. Кофе поверх этого позволил группировать код относящийся к классу, объявлять методы классов, определять наследование, для которого до этого нужно было было писать функции или подключать библиотеки.
1. .prototype — будет применяться к экземплярам класса. Если вы про то, чтобы сделать промежуточный класс для создания класса потомка с нужным прототипом, то тоже загвоздка тут. Чтобы этот прототип применился, нужно вызвать new. При этом JS создает объект с таким прототипом, а нужна функция. Все равно придется использовать __proto__.

Если же я неправильно понял, приведите, пожалуйста, пример.

2. Я уже и забывать начал, что где-то нельзя переопределять методы :) Но раз в JS можно переопределять, я этот контекст и использовал. Не уверен, называется ли имеющееся классическим, но в любом случае оно принадлежит подмножеству, доступному с помощью classkit.
2.1. Можно конечно и свою полностью, но так как-то нагляднее и везде одинаково. А где потребуется — там расширять возможности.
Но идея отличная — я добавлю такую функциональность.

3. Тут вы тоже правы — формулировка неправильная. Можно было. Но у каждого свой способ, и это часто мешает совместной разработке. classkit я писал с оглядкой на Ruby, потому что в нём пока лучшая подель модулей и классов, которую я встречал. Изобретать свой велосипед заново и обкатывать его тоже не хотелось.
Скажите, зачем выпиливать md5?

Информация

В рейтинге
Не участвует
Работает в
Зарегистрирован
Активность