docs: function (_opts) {
      // XXX What part of the comment below is still true? (We no longer
      // have Spark)
      //
      // Nested flush could plausibly happen if, say, a flush causes
      // DOM mutation, which causes a "blur" event, which runs an
      // app event handler that calls Deps.flush.  At the moment
      // Spark blocks event handlers during DOM mutation anyway,
      // because the LiveRange tree isn't valid.  And we don't have
      // any useful notion of a nested flush.
      //
      // https://app.asana.com/0/159908330244/385138233856
      if (inFlush)
        throw new Error("Can't call Deps.flush while flushing");
  
      if (inCompute)
        throw new Error("Can't flush inside Deps.autorun");
  
      inFlush = true;
      willFlush = true;
      throwFirstError = !! (_opts && _opts._throwFirstError);
  
      var finishedTry = false;
      try {
        while (pendingComputations.length ||
               afterFlushCallbacks.length) {
  
          // recompute all pending computations
          while (pendingComputations.length) {
            var comp = pendingComputations.shift();
            comp._recompute();
          }
  
          if (afterFlushCallbacks.length) {
            // call one afterFlush callback, which may
            // invalidate more computations
            var func = afterFlushCallbacks.shift();
            try {
              func();
            } catch (e) {
              _throwOrLog("afterFlush function", e);
            }
          }
        }
        finishedTry = true;
      } finally {
        if (! finishedTry) {
          // we're erroring
          inFlush = false; // needed before calling `Deps.flush()` again
          Deps.flush({_throwFirstError: false}); // finish flushing
        }
        willFlush = false;
        inFlush = false;
      }
    }