find (name, id, opts) {
    opts || (opts = {})
    const mapper = this.getMapper(name)
    const pendingQuery = this._pendingQueries[name][id]
    const usePendingFind = opts.usePendingFind === undefined ? this.usePendingFind : opts.usePendingFind
    utils._(opts, mapper)

    if (pendingQuery && (utils.isFunction(usePendingFind) ? usePendingFind.call(this, name, id, opts) : usePendingFind)) {
      return pendingQuery
    }
    const item = this.cachedFind(name, id, opts)

    if (opts.force || !item) {
      const promise = this._pendingQueries[name][id] = Container.prototype.find.call(this, name, id, opts)
      return promise
        .then((result) => {
          delete this._pendingQueries[name][id]
          result = this._end(name, result, opts)
          this.cacheFind(name, result, id, opts)
          return result
        }, (err) => {
          delete this._pendingQueries[name][id]
          return utils.reject(err)
        })
    }

    return utils.resolve(item)
  }
Wrapper for {@link Mapper#find}. Adds any found record to the store.

@example
import { SimpleStore } from 'js-data';
import { HttpAdapter } from 'js-data-http';

const store = new SimpleStore();
store.registerAdapter('http', new HttpAdapter(), { default: true });

store.defineMapper('book');

// Since this example uses the http adapter, we'll get something like:
//
//   GET /book/1234
store.find('book', 1234).then((book) => {
  // The book record is now in the in-memory store
  console.log(store.get('book', 1234) === book); // true
});

@fires SimpleStore#beforeFind
@fires SimpleStore#afterFind
@fires SimpleStore#add
@method SimpleStore#find
@param {string} name Name of the {@link Mapper} to target.
@param {(string|number)} id Passed to {@link Mapper#find}.
@param {object} [opts] Passed to {@link Mapper#find}.
@param {boolean} [opts.force] Bypass cacheFind
@param {boolean|Function} [opts.usePendingFind] See {@link SimpleStore#usePendingFind}
@returns {Promise} Resolves with the result, if any.
@since 3.0.0