46 lines
1.9 KiB
JavaScript
46 lines
1.9 KiB
JavaScript
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;
|
||
};
|
||
});
|
||
});
|