13.3 Accessing JavaScript from Prolog
AllApplicationManualNameSummaryHelp

  • Documentation
    • Reference manual
      • Using SWI-Prolog in your browser (WASM)
        • Accessing JavaScript from Prolog
          • :=/2
          • is_object/1
          • is_object/2
          • js_script/2
          • fetch/3
          • Asynchronous access to JavaScript from Prolog
          • JavaScript Promise that can be aborted
    • Packages

13.3.2 JavaScript Promise that can be aborted

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);
}