This demo of a coroutine event loop uses features of ECMAScript 6 and thus only works in recent versions of Firefox or Chrome.
Try dragging the box around, and observe how the code behaves:
var loop = coroutine(function*() {
var event;
while (event = yield) { // not dragging
if (event.type == 'mousedown') {
while (event = yield) { // dragging
if (event.type == 'mousemove')
move(event);
if (event.type == 'mouseup')
break;
}
}
// ignore mousemoves
}
});
$('#box').mousedown(loop);
$(window).mousemove(loop).mouseup(loop);
You can read more about this.