Timer

by Trae

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js"></script>
<input id="txtEmployee" type="text" data-bind="value: queryText, valueUpdate: 'afterkeydown'" />
<input type="text" data-bind="value: queryText, valueUpdate: 'afterkeydown'" />

JavaScript

var vm = vm();
ko.applyBindings(vm, document.getElementById("#txtEmployee"));

function vm() {
    var self = {},
        keyTimer = delay(500),
        //delay = Timer( 2000, "Timer, baby!" ),
        queryText,
        employees;
    queryText = ko.observable();
    employees = ko.observableArray([]);

    queryText.subscribe(function (newValue) {
        if (newValue.length > 1) {
            keyTimer.reset();
            keyTimer.promise()
            .then(function () {
                console.log('time');
            });
        }
    });

    return $.extend(self, {
        queryText: queryText,
        employees: employees
    });
}


function delay(interval) {
    var dfd = new $.Deferred(),
        time;
    
    return {
        promise: getPromise,
        reset: resetTimer
    };
    
    function getPromise(){
        return dfd.promise();
    }
    
    function resetTimer() {
        dfd.reject();
        dfd = new $.Deferred();
        clearTimeout(time);
        time = setTimeout(dfd.resolve, interval);
    }
}

function wait(interval, condition) {
    var dfr = $.Deferred();
    innerWait();
    return dfr.promise();
    
    function innerWait() {
        if (!condition) {
            setTimeout(dfr.resolve, interval);
            return;
        }
        
        if (condition()) {
            dfr.resolve();
        } else {
            setTimeout(innerWait, interval);
        }
    }
}