<!DOCTYPE html>
<html ng-app="app">

  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.min.js"></script>
    <script src="https://cdn.rawgit.com/js-data/js-data/master/dist/js-data.js"></script>
    <script src="https://cdn.rawgit.com/js-data/js-data-angular/master/dist/js-data-angular.js"></script>
    <script src="script.js"></script>
  </head>

  <body>
    <h1>Open up your console to see the output</h1>
  </body>

</html>
angular.module('app', ['js-data'])
  .service('Document', function(DS) {
    return DS.defineResource('document');
  })
  .run(function(Document) {
    var _doc;

    console.log('Document.find(1)');
    Document.find(1).then(function(document) {
      _doc = document;
      console.log('document', document);

      console.log('Document.find(1)');
      return Document.find(1);
    }).then(function(document) {
      console.log('no new request was made');
      console.log('resolving with the cached item');
      console.log('document', document);

      console.log('_doc === document', _doc === document);
    });
  });
## DS#find(resourceName, id[, options])

The "R" in "CRUD", `find` is for retrieving a single item via an adapter. With completely default settings, it's probably going to end up making a GET request to /resource/:id, where `resource` is the name of the resource and `:id` is the primary key of the item to retrieve, e.g. `store.find('user', 1)`. If you're working with the resource directly you can just do `User.find(1)`.

`find` is asynchronous and returns a promise.

`find` first checks to see if the item is already in the store and if so immediately resolved the promise with the item. Otherwise, it delegates to the `find` method of whichever adapter is being used and then injects the resulting item into the data store.

`bypassCache: true` will force delegation to the adapter (ignore the item in the store).

`cacheResponse: false` will cause the result to _not_ be injected into the store.

If `find` ends up delegating to an adapter, the `options` argument (if you passed one) will also be passed to the adapter's `find` method, so you can pass options to the adapter as well.

If the result is to be injected into the store, the `options` argument will also be passed to [`DS#inject`](http://www.js-data.io/docs/dsinject) when it is called.
{ "id": 1 }