javascript essential-pattern

66
JavaScript Essential Patterns othree @ OSDC 2012

Upload: -

Post on 15-Jan-2015

2.124 views

Category:

Technology


0 download

DESCRIPTION

Talk about the custom event, deferred and pubsub.

TRANSCRIPT

Page 1: Javascript essential-pattern

JavaScript Essential Patternsothree @ OSDC 2012

Page 2: Javascript essential-pattern

Who am I

• othree

• MozTW member

• F2E at HTC

• http://blog.othree.net

Page 3: Javascript essential-pattern

Evolution of the Web

1990 1995 2003 2005

WWWBrowser Wars

Web StandardsWeb Applications

2006

Web 2.0

2010

Mobile

Page 4: Javascript essential-pattern

Web Applications

Page 5: Javascript essential-pattern

Text

Page 6: Javascript essential-pattern
Page 7: Javascript essential-pattern
Page 8: Javascript essential-pattern
Page 9: Javascript essential-pattern
Page 10: Javascript essential-pattern

Problem to F2E

• Large scale application never seen on Web

Page 11: Javascript essential-pattern

But

• The problem F2Es face today already exists

Page 12: Javascript essential-pattern

What is Pattern

• A general reusable solution to a commonly occurring problem within a given context in software design.

http://en.wikipedia.org/wiki/Software_design_pattern

Page 13: Javascript essential-pattern

GOF Book, 1994

Page 14: Javascript essential-pattern

Browser Environment

• Async

• Event Driven

• Async

• Source Code from Internet

• Async

• Business Logic on Server

Page 15: Javascript essential-pattern

Patterns to Talk Today

• Custom Event

• Deferred

• PubSub

Page 16: Javascript essential-pattern

Custom Event

http://www.flickr.com/photos/swehrmann/6009646752

Page 17: Javascript essential-pattern

Event

• Something happens to an element, to the main document, or to the browser window and that event triggers a reaction.

http://www.yuiblog.com/blog/2007/01/17/event-plan/

Page 18: Javascript essential-pattern

Native Events

• DOM Events

• UI

• UI logic

• mutation

• ...

• BOM Events

• load

• error

• history

• ...

Page 19: Javascript essential-pattern

Problem of IE

• Didn’t follow the W3C DOM standard

• Memory leaks

• Not support bubbling/capturing

• ‘this’ is window, not element

• ‘event’ is different

http://www.quirksmode.org/blog/archives/2005/08/addevent_consid.html

Page 20: Javascript essential-pattern

Dean Edward’s Add Event

• Manage callback functions

• Fallback to elem.onevent = function () { ... }

• Only one function for each event

http://dean.edwards.name/weblog/2005/10/add-event2/

Page 21: Javascript essential-pattern

jQuery’s Event

• Normalize event object

• ‘trigger’ method to fire specific event

Page 22: Javascript essential-pattern

‘trigger’ Method

• Can fire any event as you wish

• Even none native event name works

Page 23: Javascript essential-pattern

Custom Event

• An event name is defined by you, triggered by you

Page 24: Javascript essential-pattern

When to Trigger

• State/Value change

Page 25: Javascript essential-pattern

Observer

• Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

GoF Book

Page 26: Javascript essential-pattern

Example: Backbone

• A driver model

• A car model

• Driver’s tension will get higher when shift gear

Page 27: Javascript essential-pattern

Drivervar Driver = Backbone.Model.extend( defaults: { tension: 0 }, tensionUp: function () { this.set({ tension: this.get('tension') + 1 }); });

Page 28: Javascript essential-pattern

Carvar Car = Backbone.Model.extend( defaults: { gear: 'P' });

Page 29: Javascript essential-pattern

Observervar driver = new Driver(), car = new Car();

car.on('change:gear', function () { driver.tensionUp();});

//GOcar.set({ gear: 1});

Page 30: Javascript essential-pattern

Advantages

• Loose coupling

• Prevent nested codes

Page 31: Javascript essential-pattern

Deferred

http://www.flickr.com/photos/gozalewis/3256814461/

Page 32: Javascript essential-pattern

History

• a.k.a Promise

• Idea since 1976 (Call by future)

• Dojo 0.9 (2007), 1.5 (2010)

• jQuery 1.5 (2011)

• CommonJS Promises/A

Page 33: Javascript essential-pattern

What is Deferred

• In computer science, future, promise, and delay refer to constructs used for synchronization in some concurrent programming languages.

http://en.wikipedia.org/wiki/Futures_and_promises

Page 34: Javascript essential-pattern

Example: Image Loaderfunction imgLoader(src) { var _img = new Image(), _def = $.Deferred(); _img.onload = _def.resolve; //success _img.onerror = _def.reject; //fail

_img.src = src return _def;}

Page 35: Javascript essential-pattern

Use Image LoaderimgLoader('/images/logo.png').done(function () {

$('#logo').fadeIn();

}).fail(function () {

document.location = '/404.html';

});

Page 36: Javascript essential-pattern

jQuery Deferred

• Multiple callback functions

• Add callbacks at any time

• jQuery.when

http://api.jquery.com/category/deferred-object/

Page 37: Javascript essential-pattern

Image Loader with Cachefunction imgLoader(src) { if (imgLoader[src]) { return imgLoader[src]; }

var _img = new Image(), _def = $.Deferred(); imgLoader[src] = _def; _img.onload = _def.resolve; //success _img.onerror = _def.reject; //fail

_img.src = src return _def;}

Page 38: Javascript essential-pattern

Use Image LoaderimgLoader('/images/logo.png').done(function () { $('#logo').fadeIn();}).fail(function () { document.location = '/404.html';});

imgLoader('/images/logo.png').done(function () { App.init();});

imgLoader('/images/logo.png').fail(function () { App.destroy();});

Page 39: Javascript essential-pattern

jQuery.when$.when(

$.getJSON('/api/jedis'), $.getJSON('/api/siths'), $.getJSON('/api/terminators')

).done(function (jedis, siths, terminators) {

// do something....

});

Page 40: Javascript essential-pattern

Advantages

• Manage callbacks

• Cache results

• $.when

Page 41: Javascript essential-pattern

PubSub

http://www.flickr.com/photos/birdfarm/519230710/

Page 42: Javascript essential-pattern

Case

• A module know when user signin

• X, Y modules need to know when user signin

• A should not fail when X or Y fails

Page 43: Javascript essential-pattern

Without PubSub

Page 44: Javascript essential-pattern

signin

signin

A Y

X

ZB

Page 45: Javascript essential-pattern

X, Y depends on A

Page 46: Javascript essential-pattern

PubSubSubscribe Event Only

Page 47: Javascript essential-pattern

PubSub

A Y

X

ZB

Page 48: Javascript essential-pattern

PubSubsubscribe

‘signin’

subscribe‘signin’

A Y

X

ZB

Page 49: Javascript essential-pattern

PubSubpublish‘signin’A Y

X

ZB

Page 50: Javascript essential-pattern

PubSubsignin

signin

A Y

X

ZB

Page 51: Javascript essential-pattern

Publish/Subscribe

• Mediator + Observer

• Easy to implement

Page 52: Javascript essential-pattern

http://addyosmani.com/blog/jqcon-largescalejs-2012/

$(document).trigger('eventName');//equivalent to $.publish('eventName')$(document).on('eventName',...);//equivalent to $.subscribe('eventName',...)

// Using .on()/.off() from jQuery 1.7.1(function($) { var o = $({}); $.subscribe = function() { o.on.apply(o, arguments); }; $.unsubscribe = function() { o.off.apply(o, arguments); }; $.publish = function() { o.trigger.apply(o, arguments); };}(jQuery));

// Multi-purpose callbacks list object// Pub/Sub implementation:

var topics = {};

jQuery.Topic = function( id ) { var callbacks, topic = id && topics[ id ]; if ( !topic ) { callbacks = jQuery.Callbacks(); topic = { publish: callbacks.fire, subscribe: callbacks.add, unsubscribe: callbacks.remove }; if ( id ) { topics[ id ] = topic; } } return topic;};

//Using Underscore and Backbone

var myObject = {};

_.extend( myObject, Backbone.Events );

//Example

myObject.on('eventName', function( msg ) { console.log( 'triggered:' + msg );});

myObject.trigger('eventName', 'some event');

Page 53: Javascript essential-pattern

When to Use

• Module and module have dependency but not really depend on it.

Page 54: Javascript essential-pattern

Example: Error Handler

• An module to control the behavior when error occurs

• All other module should call it when something went wrong

• No module should fail because error handler fails

Page 55: Javascript essential-pattern

Error Handler Code//Error Handler$.subscribe('AJAXfail', function () { alert('Something wrong!!');});

//Code$.get('/api/siths').fail(function () { $.publish('AJAXfail');});

Page 56: Javascript essential-pattern

Advantages

• Loose coupling

• Scalability

Page 57: Javascript essential-pattern

Summary

• Control async process using deferred

• Modulize your application

• Decouple using custom event

• Decouple more using pubsub

Page 58: Javascript essential-pattern

Further Reading...

Page 59: Javascript essential-pattern
Page 60: Javascript essential-pattern
Page 63: Javascript essential-pattern

http://leanpub.com/asyncjs

Page 64: Javascript essential-pattern

May the Patterns be with You

Page 65: Javascript essential-pattern

Questions?

Page 66: Javascript essential-pattern

Photos License

• CC License

• http://www.flickr.com/photos/sbisson/298160250/

• http://www.flickr.com/photos/gozalewis/3256814461/

• http://www.flickr.com/photos/birdfarm/519230710/

• Licensed by Author

• http://www.flickr.com/photos/swehrmann/6009646752