This commit is contained in:
Oleg Mokhov
2015-06-20 12:26:08 +03:00
committed by mokhov
parent a716969f4e
commit f3546ef3a5
85 changed files with 16682 additions and 1 deletions

View File

@@ -0,0 +1,45 @@
modules.define('y-debounce', function (provide) {
/**
* Вернет версию функции, исполнение которой начнется не ранее,
* чем истечет промежуток wait, после ее последнего вызова.
*
* Полезно для реализации логики, которая зависит от завершения
* действий пользователя. Например, проверить орфографию комментария
* пользователя лучше будет после того, как он его окончательно введет,
* а динамечески перерассчитать разметку после того, как пользователь
* закончит изменять размер окна.
*
* @name debounce
* @param {Function} func
* @param {Number} wait
* @param {Boolean} [immediate=false] Если true, выполнит функцию в начале
* интервала wait, иначе - в конце.
* @returns {Function}
*
* @example
* var calculateLayout = function() {};
* var lazyLayout = debounce(calculateLayout, 300);
* $(window).resize(lazyLayout);
*/
provide(function (func, wait, immediate) {
var result;
var timeout = null;
return function () {
var context = this;
var args = arguments;
var later = function () {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
}
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
}
return result;
};
});
});

View File

@@ -0,0 +1,6 @@
# y-debounce:
Модуль `y-debounce` возвращает функцию `debounce`, которая используется для реализации отложенных действий.
Подробности по клику на функции.
<!--JS_API-->

View File

@@ -0,0 +1,59 @@
modules.define('test', ['y-debounce'], function (provide, debounce) {
describe('debounce', function () {
it('should debounce given function', function (done) {
var counter = 0;
var incr = function () {
counter++;
};
var debouncedIncr = debounce(incr, 32);
debouncedIncr();
debouncedIncr();
setTimeout(debouncedIncr, 16);
setTimeout(function () {
counter.should.eq(1, 'incr was debounced');
done();
}, 96);
});
it('should call given function immediately if "immediate" param is true', function (done) {
var a;
var b;
var counter = 0;
var incr = function () {
return ++counter;
};
var debouncedIncr = debounce(incr, 64, true);
a = debouncedIncr();
b = debouncedIncr();
a.should.eq(1);
b.should.eq(1);
counter.should.eq(1, 'incr was called immediately');
setTimeout(debouncedIncr, 16);
setTimeout(debouncedIncr, 32);
setTimeout(debouncedIncr, 48);
setTimeout(function () {
counter.should.eq(1, 'incr was debounced');
done();
}, 128);
});
it('should work properly when debounced function called recursively', function (done) {
var counter = 0;
var debouncedIncr = debounce(function () {
counter++;
if (counter < 10) {
debouncedIncr();
}
}, 32, true);
debouncedIncr();
counter.should.eq(1, 'incr was called immediately');
setTimeout(function () {
counter.should.eq(1, 'incr was debounced');
done();
}, 96);
});
});
provide();
});