thenableCall(
      method, requestMessage, metadata, methodDescriptor, options = {}) {
    const hostname = getHostname(method, methodDescriptor);
    const signal = options && options.signal;
    const initialInvoker = (request) => new Promise((resolve, reject) => {
      // If the signal is already aborted, immediately reject the promise
      // and don't issue the call.
      if (signal && signal.aborted) {
        const error = new RpcError(StatusCode.CANCELLED, 'Aborted');
        error.cause = signal.reason;
        reject(error);
        return;
      }

      const stream = this.startStream_(request, hostname);
      let unaryMetadata;
      let unaryStatus;
      let unaryMsg;
      GrpcWebClientBase.setCallback_(
          stream,
          (error, response, status, metadata, unaryResponseReceived) => {
            if (error) {
              reject(error);
            } else if (unaryResponseReceived) {
              unaryMsg = response;
            } else if (status) {
              unaryStatus = status;
            } else if (metadata) {
              unaryMetadata = metadata;
            } else {
              resolve(request.getMethodDescriptor().createUnaryResponse(
                  unaryMsg, unaryMetadata, unaryStatus));
            }
          },
          true);

      // Wire up cancellation from the abort signal, if any.
      if (signal) {
        signal.addEventListener('abort', () => {
          stream.cancel();

          const error = new RpcError(StatusCode.CANCELLED, 'Aborted');
          error.cause = /** @type {!AbortSignal} */ (signal).reason;
          reject(error);
        });
      }
    });
    const invoker = GrpcWebClientBase.runInterceptors_(
        initialInvoker, this.unaryInterceptors_);
    const unaryResponse = /** @type {!Promise<?>} */ (invoker.call(
        this, methodDescriptor.createRequest(requestMessage, metadata)));
    return unaryResponse.then((response) => response.getResponseMessage());
  }
@param {string} method The method to invoke
@param {REQUEST} requestMessage The request proto
@param {!Object<string, string>} metadata User defined call metadata
@param {!MethodDescriptor<REQUEST, RESPONSE>} methodDescriptor
@param {?PromiseCallOptions=} options Options for the call
@return {!Promise<RESPONSE>}
@template REQUEST, RESPONSE