Time-Sensitive Echo
CJam, 45 41 39 36 34 bytes
{eslN1$}g;es](es-fm3/{){_es>}g;o}/
This doesn't really make sense in the online interpreter of course, but it works in the Java interpreter.
It doesn't display a prompt.
Explanation
{ e# Do while... (popping the condition from the stack)
es e# Get the current timestamp.
l e# Wait for a line to be entered and read it.
N e# Push a linefeed.
1$ e# Copy the line we read - this terminates if the line is empty, because
e# empty strings/arrays are falsy.
}g
; e# Discard the last linefeed (the one after the empty input).
es e# Push the current timestamp (corresponding to the last, empty, input).
] e# Wrap everything in an array. This is now a flat array containing:
e# - The initial timestamp.
e# - Three elements for each line: the line, a linefeed, the timestamp.
e# - Two elements for the last line: the empty string and the timestamp.
( e# Pull off the initial time.
es- e# Subtract the current time, which gives (minus) the difference between
e# when a line was entered and when it should be printed back.
fm e# This maps "minus that value" onto each element in the array. Now the lines
e# and linefeeds are strings (arrays) - so minus is set difference, but they
e# only contain characters, not any integers (like the difference value), so
e# none of the strings will be affected.
e# The timestamps on the other hand will be incremented by the time difference
e# between reading and printing, giving the time at which each line should be
e# printed back.
3/ e# Split the array into chunks of 3 (where the remaining two elements are
e# just grouped as a pair).
{ e# For each of those chunks...
) e# Pull off the timestamp.
{ e# Do while... (popping the condition from the stack)
_ e# Duplicate the target time.
es> e# Check if it's still greater than the current time.
}g
;o e# Discard the target time and print the rest of the current chunk, which will
e# automatically be flattened/concatenated into a single string.
}/
JavaScript, 119 112 bytes
k=(d=Date.now)(i=j=[]);do{i[++j]=[prompt(),d()-k]}while(i[j][0]);i.map(a=>setTimeout(b=>console.log(a[0]),a[1]))
Hoping to find a couple more bytes to cut out.
JavaScript, 120 bytes
No chance of getting near to CJam with this approach, but a straightforward script.
a=[];t=+new Date;while(s=prompt()){a.push({s:s,t:+new Date})}while(v=a.pop()){setTimeout(`console.log('${v.s}')`,v.t-t)}