async function runAsync(encode, prerun, postrun) {
    // await previously queued functions
    while (this._running) await this._running;

    // run dataflow, manage running promise
    const clear = () => this._running = null;
    (this._running = this.evaluate(encode, prerun, postrun)).then(clear, clear);
    return this._running;
  }
Queues dataflow evaluation to run once any other queued evaluations have
completed and returns a Promise that resolves when the queued pulse
propagation completes. If provided, a callback function will be invoked
immediately before evaluation commences. This method will ensure a
separate evaluation is invoked for each time it is called.
@param {string} [encode] - The name of an encoding set to invoke during
  propagation. This value is added to generated Pulse instances;
  operators can then respond to (or ignore) this setting as appropriate.
  This parameter can be used in conjunction with the Encode transform in
  the vega-encode package.
@param {function} [prerun] - An optional callback function to invoke
  immediately before dataflow evaluation commences.
@param {function} [postrun] - An optional callback function to invoke
  after dataflow evaluation completes. The callback will be invoked
  after those registered via {@link runAfter}.
@return {Promise} - A promise that resolves to this dataflow after
  evaluation completes.