function requestData(that, keyframeNode) {
  if (
    that._simultaneousRequestCount >=
    VoxelTraversal.simultaneousRequestCountMaximum
  ) {
    return;
  }

  const primitive = that._primitive;
  const provider = primitive.provider;
  const { keyframe, spatialNode } = keyframeNode;
  if (
    defined(provider.availableLevels) &&
    spatialNode.level >= provider.availableLevels
  ) {
    return;
  }

  function postRequestSuccess(result) {
    that._simultaneousRequestCount--;
    keyframeNode.content = result;
    keyframeNode.state = defined(result)
      ? KeyframeNode.LoadState.PROCESSING
      : KeyframeNode.LoadState.UNAVAILABLE;
  }

  function postRequestFailure(error) {
    that._simultaneousRequestCount--;
    keyframeNode.state = KeyframeNode.LoadState.FAILED;
    that._primitive.tileFailed.raiseEvent();
  }

  const requestParameters = {
    tileLevel: spatialNode.level,
    tileX: spatialNode.x,
    tileY: spatialNode.y,
    tileZ: spatialNode.z,
    keyframe: keyframe,
  };
  const promise = provider.requestData(requestParameters);
  if (!defined(promise)) {
    return;
  }
  that._simultaneousRequestCount++;
  keyframeNode.state = KeyframeNode.LoadState.RECEIVING;
  promise.then(postRequestSuccess).catch(postRequestFailure);
}
@function

@param {VoxelTraversal} that
@param {KeyframeNode} keyframeNode

@private