From fc90c0dd2d03a4e842a5f4df546da868850d9657 Mon Sep 17 00:00:00 2001 From: Timotej Lazar Date: Tue, 23 Feb 2016 17:48:01 +0100 Subject: Ensure a ~1 second delay before displaying test results --- js/codeq/core.js | 17 ++++++++++++++++- js/codeq/prolog.js | 41 ++++++++++++++++++++++++----------------- js/codeq/python.js | 17 +++++++++++++---- 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/js/codeq/core.js b/js/codeq/core.js index 84bbfa8..b1d4a5c 100644 --- a/js/codeq/core.js +++ b/js/codeq/core.js @@ -329,8 +329,23 @@ along with this program. If not, see . */ }); }, - // codeq event handling + // resolve a promise not sooner than after [timeout] seconds + // from https://github.com/kriskowal/q/commit/681f6d201842d4b99bab5451ebc57ef0c3c0d49a + 'throttle': function (promise, timeout) { + if (timeout === undefined) { + timeout = promise; + promise = undefined; + } + var deferred = Q.defer(); + Q.when(promise, undefined, undefined, deferred.notify); + setTimeout(function () { + deferred.resolve(promise); + }, timeout); + return deferred.promise; + }, + + // codeq event handling 'fire': function (eventName, args) { queuedEvents.push({'name': eventName, 'args': args}); fireEvents(); diff --git a/js/codeq/prolog.js b/js/codeq/prolog.js index 3d34423..ea4c9b2 100644 --- a/js/codeq/prolog.js +++ b/js/codeq/prolog.js @@ -284,28 +284,35 @@ along with this program. If not, see . */ }); jqBtnTest.on('click', function () { + // random timeout before returning results to the user, helps + // maintain the illusion + var timeout = 500 + Math.random() * 1000; + editor.setOption('readOnly', true); terminal.inputDisable(); jqBtnTest.ladda('start'); - codeq.comms.sendTest({ + + codeq.throttle( + codeq.comms.sendTest({ 'program': editor.getDoc().getValue(), 'problem_id': problemDef.id - }) - .then(function (data) { - if (data.code === 0) { - hinter.handle(data.hints); - } - else { - terminal.append(data.message + '\n', 'error'); - } - }) - .fail(commError) - .fin(function () { - editor.setOption('readOnly', false); - terminal.inputEnable(); - jqBtnTest.ladda('stop'); - }) - .done(); + }), + timeout) + .then(function (data) { + if (data.code === 0) { + hinter.handle(data.hints); + } + else { + terminal.append(data.message + '\n', 'error'); + } + }) + .fail(commError) + .fin(function () { + editor.setOption('readOnly', false); + terminal.inputEnable(); + jqBtnTest.ladda('stop'); + }) + .done(); }); codeq.comms.loadProblem(problemDef.id).done(); diff --git a/js/codeq/python.js b/js/codeq/python.js index f2b0184..2ea960a 100644 --- a/js/codeq/python.js +++ b/js/codeq/python.js @@ -240,12 +240,20 @@ along with this program. If not, see . */ } }); jqBtnTest.on('click', function () { + // random timeout before returning results to the user, helps + // maintain the illusion + var timeout = 500 + Math.random() * 1000; + editor.setOption('readOnly', true); + terminal.inputDisable(); jqBtnTest.ladda('start'); - codeq.comms.sendTest({ - 'program': editor.getDoc().getValue(), - 'problem_id': problemDef.id - }) + + codeq.throttle( + codeq.comms.sendTest({ + 'program': editor.getDoc().getValue(), + 'problem_id': problemDef.id + }), + timeout) .then(function (data) { if (data.code === 0) { hinter.handle(data.hints); @@ -257,6 +265,7 @@ along with this program. If not, see . */ .fail(commError) .fin(function () { editor.setOption('readOnly', false); + terminal.inputEnable(); jqBtnTest.ladda('stop'); }) .done(); -- cgit v1.2.1