Home

Awesome

Backbone Service

Simple service class for Backbone.

Travis build status Code Climate Test Coverage Dependency Status devDependency Status

Usage

Note: Backbone.Service requires a global Promise object to exist, please include a Promise polyfill if necessary.

import Service from 'backbone.service';

const AuthService = Service.extend({
  start() {
    this.user = new User();
    return this.user.fetch();
  },

  requests: {
    isAuthenticated: 'isAuthenticated',
    authenticate: 'authenticate'
  },

  isAuthenticated() {
    return this.user.get('isAuthenticated');
  },

  authenticate() {
    this.user.authenticate();
  },

  onError(err) {
    console.log('Err!', err);
  }
});

const authService = new AuthService();

const Page = View.extend({
  render() {
    authService.request('isAuthenticated').then(isAuthenticated => {
      if (isAuthenticated) {
        this.$el.html('Welcome!');
        return;
      }

      this.$el.html('Permission denied.')
      return authService.request('authenticate').then(() => this.render());
    }).catch(err => {
      this.$el.html('Oh no!');
    });
  }
});

// Which would behave like you wrote all of this:

const Page = View.extend({
  render() {
    Promise.resolve()
      .then(() => {
        if (!authService.isStarted) {
          return authService.start().catch(err => {
            authService.onError(err);
            throw err;
          }))
        }
      })
      .then(() => authService.isAuthenticated().catch(err => {
        authService.onError(err);
        throw err;
      })))
      .then(isAuthenticated => {
        if (isAuthenticated) {
          this.$el.html('Welcome!');
          return;
        }

        this.$el.html('Permission denied.')
        return Promise.resolve()
          .then(() => authService.authenticate().catch(err => {
            authService.onError(err);
            throw err;
          }))
          .then(() => this.render());
        }
      }).catch(err => {
        this.$el.html('Oh no!');
      });
  }
});

Contibuting

Getting Started

Fork and clone this repo.

git clone git@github.com:thejameskyle/backbone.service.git && cd backbone.service

Make sure Node.js and npm are installed.

npm install

Running Tests

npm test

===

© 2015 James Kyle. Distributed under ISC license.