A Promise
resolves or is rejected. As Prolog waits for a
specific promise on a call to await/2
we may want to abort long running operations. This may be achieved using
the class
Prolog.Promise
which extends Promise
. To make
the promise abortable the executor function must have an
abort
property. Below is the code for
Prolog.promise_sleep()
that implements this schema.
First we create the executor and use properties on the function
itself to represent the necessary state information (here, the running
timer). Next, we add an abort
property the clears the timer
and runs the reject
callback of the Promise
.
Finally we return an instance of Prolog.Promise
which
implements .abort()
.
promise_sleep(time) { const f = function(resolve, reject) { f.reject = reject; f.timer = setTimeout(() => { f.timer = undefined; resolve(true); }, time*1000); }; f.abort = function() { if ( f.timer ) { clearTimeout(f.timer); f.timer = undefined; f.reject("abort"); } } return new Prolog.Promise(f); }