{% include anchor.html edit="true" title="API overview" hash="overview" %}

PouchDB has an asynchronous API, supporting [callbacks](http://docs.nodejitsu.com/articles/getting-started/control-flow/what-are-callbacks), [promises][promise], and
[async functions](https://jakearchibald.com/2014/es7-async-functions/). For beginners, we recommend promises, although you are free to use whatever format you prefer. If you are unsure, check out our [guide to asynchronous code](/guides/async-code.html).

Most of the API is exposed as:

{% highlight js %}
db.doSomething(args..., [options], [callback])
{% endhighlight %}

&hellip; where both the `options` and `callback` are optional.

### Callbacks

Callbacks use the standard Node.js idiom of:

{% highlight js %}
function(error, result) { /* ... */ }
{% endhighlight %}

&hellip; where the `error` will be undefined if there's no error.

### Promises

If you don't specify a `callback`, then the API returns a [promise][]. In [supported browsers](http://caniuse.com/#feat=promises) or Node.js, native promises are used, falling back to the minimal library [lie][] as needed.

{% include alert/start.html variant="info"%}
{% markdown %}

**Using Ionic/AngularJS?**  You can wrap PouchDB promises in [`$q.when()`](https://docs.angularjs.org/api/ng/service/$q#when). This will notify AngularJS to update the UI when the PouchDB promise has resolved.

{% endmarkdown %}
{% include alert/end.html%}

To use a custom promise implementation with PouchDB, you must redefine a global `Promise` object before loading PouchDB:

{% highlight html %}
<script>window.Promise = MyCustomPromiseLibrary;</script>
<script src="path/to/pouchdb.js"></script>
{% endhighlight %}

### Async functions

Another option is to use `async`/`await` pattern instead of promises chain (ie. `.then().catch()`). `async`/`await` is widely supported by all major browsers and Node.js. Use a transpiler with `async`/`await` polyfill such as [Babel](http://babeljs.io/) if you need to support older browsers.

Note that the samples for `async`/`await` in the API documentation assume that your code is inside an async function. So for instance:

{% highlight js %}
async function myFunction() {
  // your code goes in here
}
{% endhighlight %}

Any `await` not inside of an async function is a syntax error. For more information about `async`/`await`, read [our introductory blog post]({{ site.baseurl }}/2015/03/05/taming-the-async-beast-with-es7.html).

[promise]: https://www.promisejs.org/
[lie]: https://github.com/calvinmetcalf/lie
[event emitter]: http://nodejs.org/api/events.html#events_class_events_eventemitter
