SlideShare a Scribd company logo
1 of 135
.when() to use
  deferreds
 Alex McPherson - Quick Left
console.log(talkOutline)
console.log(talkOutline)

• Who’s Alex McPherson
console.log(talkOutline)

• Who’s Alex McPherson
• j@ubourg and some history
console.log(talkOutline)

• Who’s Alex McPherson
• j@ubourg and some history
• Code walkthrough
console.log(talkOutline)

• Who’s Alex McPherson
• j@ubourg and some history
• Code walkthrough
• 6 problems, 6 solutions
console.log(talkOutline)

• Who’s Alex McPherson
• j@ubourg and some history
• Code walkthrough
• 6 problems, 6 solutions
• Best practices
console.log(talkOutline)

• Who’s Alex McPherson
• j@ubourg and some history
• Code walkthrough
• 6 problems, 6 solutions
• Best practices
• Q &A
alex.define()
Important, life altering facts:
alex.define()
              Important, life altering facts:


•   Sublime Text 2
alex.define()
               Important, life altering facts:


•   Sublime Text 2

•   Railscasts 2 color
    scheme
alex.define()
               Important, life altering facts:


•   Sublime Text 2

•   Railscasts 2 color
    scheme

•   Comma Last
alex.define()
               Important, life altering facts:


•   Sublime Text 2

•   Railscasts 2 color
    scheme

•   Comma Last

•   Always include
    semicolons
alex.define()
               Important, life altering facts:


•   Sublime Text 2               •   Boston to Boulder

•   Railscasts 2 color
    scheme

•   Comma Last

•   Always include
    semicolons
alex.define()
               Important, life altering facts:


•   Sublime Text 2               •   Boston to Boulder

•   Railscasts 2 color           •   Quick Left
    scheme

•   Comma Last

•   Always include
    semicolons
alex.define()
               Important, life altering facts:


•   Sublime Text 2               •   Boston to Boulder

•   Railscasts 2 color           •   Quick Left
    scheme
                                     •   Front End
•   Comma Last

•   Always include
    semicolons
alex.define()
               Important, life altering facts:


•   Sublime Text 2               •   Boston to Boulder

•   Railscasts 2 color           •   Quick Left
    scheme
                                     •   Front End
•   Comma Last
                                     •   Training and CU
•   Always include
    semicolons
alex.define()
    Skillset
alex.define()
                            Skillset


•   Fortune 500 Financial
alex.define()
                            Skillset


•   Fortune 500 Financial
    • Code performance
alex.define()
                            Skillset


•   Fortune 500 Financial
    • Code performance
    • IE6
alex.define()
                            Skillset


•   Fortune 500 Financial
    • Code performance
    • IE6
alex.define()
                            Skillset


•   Fortune 500 Financial
    • Code performance
    • IE6
alex.define()
                            Skillset


•   Fortune 500 Financial
    • Code performance
    • IE6
alex.define()
                            Skillset


•   Fortune 500 Financial
    • Code performance
    • IE6
alex.define()
                            Skillset


•   Fortune 500 Financial
    • Code performance
    • IE6
alex.define()
                            Skillset


•   Fortune 500 Financial          •   1-3 month startups
    • Code performance
    • IE6
alex.define()
                            Skillset


•   Fortune 500 Financial          •   1-3 month startups
    • Code performance                 •  Get stuff done
    • IE6
alex.define()
                            Skillset


•   Fortune 500 Financial          •   1-3 month startups
    • Code performance                 •  Get stuff done
    • IE6                              •  Thick clients,
                                          Backbone.js,
                                          websockets
deferred.history
deferred.history
•   November 2009, $.ajax
    requests
deferred.history
•   November 2009, $.ajax
    requests

•   Julian Aubourg steps up,
    rewrites
deferred.history
•   November 2009, $.ajax
    requests

•   Julian Aubourg steps up,
    rewrites

•   Suggested that internal
    API be exposed
deferred.history
•   November 2009, $.ajax
    requests

•   Julian Aubourg steps up,
    rewrites

•   Suggested that internal
    API be exposed

•   Reworked, released
    January 2010
deferred.history
•   November 2009, $.ajax      •   ‘Based on’ CommonJS
    requests                       Promises/A proposal

•   Julian Aubourg steps up,
    rewrites

•   Suggested that internal
    API be exposed

•   Reworked, released
    January 2010
deferred.history
•   November 2009, $.ajax      •   ‘Based on’ CommonJS
    requests                       Promises/A proposal

•   Julian Aubourg steps up,   •   Used internally in
    rewrites                       jQuery, AJAX and effects

•   Suggested that internal
    API be exposed

•   Reworked, released
    January 2010
deferred.history
•   November 2009, $.ajax      •   ‘Based on’ CommonJS
    requests                       Promises/A proposal

•   Julian Aubourg steps up,   •   Used internally in
    rewrites                       jQuery, AJAX and effects

•   Suggested that internal    •   How do we use it?
    API be exposed

•   Reworked, released
    January 2010
code.inspect()
code.inspect()
What exactly is a $.Deferred()?
code.inspect()
         What exactly is a $.Deferred()?


State storage object:
code.inspect()
         What exactly is a $.Deferred()?


State storage object:
code.inspect()
      What exactly is a $.Deferred()?




‘pending’
code.inspect()
      What exactly is a $.Deferred()?




‘pending’
code.inspect()
      What exactly is a $.Deferred()?




                                ‘resolved’
‘pending’
code.inspect()
      What exactly is a $.Deferred()?




                                ‘resolved’
‘pending’
code.inspect()
      What exactly is a $.Deferred()?




                                ‘resolved’
‘pending’

                                ‘rejected’
code.inspect()
      What exactly is a $.Deferred()?




                                ‘resolved’
‘pending’

                                ‘rejected’
code.inspect()
What exactly is a $.Deferred()?




                          ‘resolved’



                          ‘rejected’
code.inspect()
        What exactly is a $.Deferred()?



‘resolved’



‘rejected’
code.inspect()
        What exactly is a $.Deferred()?



‘resolved’



‘rejected’
code.inspect()
        What exactly is a $.Deferred()?



‘resolved’



‘rejected’
code.inspect()
        What exactly is a $.Deferred()?



‘resolved’



‘rejected’
              }
code.inspect()
What exactly is a $.Deferred()?
code.inspect()
         What exactly is a $.Deferred()?

• .always(fn)
• .done(fn)
• .fail(fn)
code.inspect()
         What exactly is a $.Deferred()?

• .always(fn)
• .done(fn)
• .fail(fn)

• .reject(ctx, args)
• .rejectWith(ctx, args)
• .resolve(ctx, args)
• .resolveWith(ctx, args)
code.inspect()
         What exactly is a $.Deferred()?

• .always(fn)               • .state()
• .done(fn)                 • .isRejected()
• .fail(fn)                 • .isResolved()

• .reject(ctx, args)
• .rejectWith(ctx, args)
• .resolve(ctx, args)
• .resolveWith(ctx, args)
code.inspect()
           What exactly is a $.Deferred()?

• .always(fn)                 • .state()
• .done(fn)                   • .isRejected()
• .fail(fn)                   • .isResolved()

•   .reject(ctx, args)        • .pipe()
•   .rejectWith(ctx, args)    • .then()
•   .resolve(ctx, args)       • .when()
•   .resolveWith(ctx, args)
bringEmOut(examples)
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources
1. Bundling AJAX Calls
Task at hand: Render a small sidebar with data from 3 different sources




               $.when returns one deferred
                   to represent many
2. Template Pattern
Task at hand: Single page app, some pages need data, others don’t
2. Template Pattern
Task at hand: Single page app, some pages need data, others don’t
2. Template Pattern
Task at hand: Single page app, some pages need data, others don’t
2. Template Pattern
Task at hand: Single page app, some pages need data, others don’t
2. Template Pattern
Task at hand: Single page app, some pages need data, others don’t
2. Template Pattern
Task at hand: Single page app, some pages need data, others don’t




Any object that isn’t a deferred can still be
treated like one.
2. Template Pattern
Task at hand: Single page app, some pages need data, others don’t




Any object that isn’t a deferred can still be
treated like one.


It will get immediately resolved.
3.Cache Money
Task at hand: Your app uses a rate limited API. Don’t go over!
3.Cache Money
Task at hand: Your app uses a rate limited API. Don’t go over!
3.Cache Money
Task at hand: Your app uses a rate limited API. Don’t go over!
3.Cache Money
Task at hand: Your app uses a rate limited API. Don’t go over!
3.Cache Money
Task at hand: Your app uses a rate limited API. Don’t go over!
3.Cache Money
Task at hand: Your app uses a rate limited API. Don’t go over!
3.Cache Money
Task at hand: Your app uses a rate limited API. Don’t go over!




        Callbacks attached to deferreds
        always get the same arguments
4. Pretty Syntax
Task at hand: Make your javascript look awesome
4. Pretty Syntax
Task at hand: Make your javascript look awesome


a)   setTimeout(500, myFunction)
b)   setTimeOut(myFunction, 500)
c)   setTimeOut(500, myFunction)
d)   setTimeout(myFunction, 500)
4. Pretty Syntax
Task at hand: Make your javascript look awesome


a)   setTimeout(500, myFunction)
b)   setTimeOut(myFunction, 500)
c)   setTimeOut(500, myFunction)
d)   setTimeout(myFunction, 500)    <<<
4. Pretty Syntax
Task at hand: Make your javascript look awesome


a)   setTimeout(500, myFunction)
b)   setTimeOut(myFunction, 500)
c)   setTimeOut(500, myFunction)
d)   setTimeout(myFunction, 500)    <<<
4. Pretty Syntax
Task at hand: Make your javascript look awesome


a)   setTimeout(500, myFunction)
b)   setTimeOut(myFunction, 500)
c)   setTimeOut(500, myFunction)
d)   setTimeout(myFunction, 500)    <<<
4. Pretty Syntax
Task at hand: Make your javascript look awesome
4. Pretty Syntax
Task at hand: Make your javascript look awesome
4. Pretty Syntax
Task at hand: Make your javascript look awesome
4. Pretty Syntax
Task at hand: Make your javascript look awesome
4. Pretty Syntax
Task at hand: Make your javascript look awesome




The natural-language syntax is already
 there, but feel free to add your own.

                       Return promises
5.Arbitrary ‘events’
Task at hand: Get updates during a longer process
5.Arbitrary ‘events’
Task at hand: Get updates during a longer process
5.Arbitrary ‘events’
Task at hand: Get updates during a longer process
5.Arbitrary ‘events’
Task at hand: Get updates during a longer process
5.Arbitrary ‘events’
Task at hand: Get updates during a longer process
5.Arbitrary ‘events’
Task at hand: Get updates during a longer process
5.Arbitrary ‘events’
Task at hand: Get updates during a longer process
5.Arbitrary ‘events’
Task at hand: Get updates during a longer process
5.Arbitrary ‘events’
Task at hand: Get updates during a longer process
5.Arbitrary ‘events’
Task at hand: Get updates during a longer process




         .progress() callbacks fired with
         .notify() can let you get insight
           into long running processes


    $.Animation and HTML5 file upload
6. Managing
Animations
Task at hand: Implement a complex animation with tight tolerances


Built in helper methods generate promises on their DOM nodes:
6. Managing
Animations
Task at hand: Implement a complex animation with tight tolerances


Built in helper methods generate promises on their DOM nodes:

  • .animate()
  • .fadeIn()
  • .fadeOut()
  • .hide()
  • .show()
  • .slideUp()
  • .slideDown()
  • .Animate()
6. Managing
Animations
Task at hand: Implement a complex animation with tight tolerances
6. Managing
Animations
Task at hand: Implement a complex animation with tight tolerances
6. Managing
Animations
Task at hand: Implement a complex animation with tight tolerances
6. Managing
Animations
Task at hand: Implement a complex animation with tight tolerances
6. Managing
Animations
Task at hand: Implement a complex animation with tight tolerances
6. Managing
Animations
Task at hand: Implement a complex animation with tight tolerances




         Syncing multiple animations is
            hard without deferreds
Things I didn’t even
mention but are still
awesome:
Things I didn’t even
mention but are still
awesome:

• Registering multiple callbacks!
Things I didn’t even
mention but are still
awesome:

• Registering multiple callbacks!
• Post-resolution binding!
Things I didn’t even
mention but are still
awesome:

• Registering multiple callbacks!
• Post-resolution binding!
• Helpful .then(d, f) shortcut syntax!
Things I didn’t even
mention but are still
awesome:

• Registering multiple callbacks!
• Post-resolution binding!
• Helpful .then(d, f) shortcut syntax!
• Dependent AJAX calls!
Things I didn’t even
mention but are still
awesome:

• Registering multiple callbacks!
• Post-resolution binding!
• Helpful .then(d, f) shortcut syntax!
• Dependent AJAX calls!
• Memoizing expensive operations!
Things I didn’t even
mention but are still
awesome:

• Registering multiple callbacks!
• Post-resolution binding!
• Helpful .then(d, f) shortcut syntax!
• Dependent AJAX calls!
• Memoizing expensive operations!
• Implementing a publisher/subscriber pattern!
Deferred best practices
Deferred best practices


• When in doubt, return a deferred
Deferred best practices


• When in doubt, return a deferred
• Better yet, return a .promise()
Deferred best practices


• When in doubt, return a deferred
• Better yet, return a .promise()
• Powerful as properties on objects
Deferred best practices


• When in doubt, return a deferred
• Better yet, return a .promise()
• Powerful as properties on objects
• Make you code prettier
Deferred best practices


• When in doubt, return a deferred
• Better yet, return a .promise()
• Powerful as properties on objects
• Make you code prettier
• Make your life easier
What we covered:
What we covered:


• Bundling AJAX calls together
What we covered:


• Bundling AJAX calls together
• Normalizing by using .done on non-deferreds
What we covered:


• Bundling AJAX calls together
• Normalizing by using .done on non-deferreds
• Implementing cache objects
What we covered:


• Bundling AJAX calls together
• Normalizing by using .done on non-deferreds
• Implementing cache objects
• Prettier syntax and DSLs
What we covered:


• Bundling AJAX calls together
• Normalizing by using .done on non-deferreds
• Implementing cache objects
• Prettier syntax and DSLs
• Progress on long-running operations
What we covered:


• Bundling AJAX calls together
• Normalizing by using .done on non-deferreds
• Implementing cache objects
• Prettier syntax and DSLs
• Progress on long-running operations
• Manage animations
talk.resolve()


        • @alexmcpherson
        • McPhersonIndustries.com
                                     Credits:
j@ubourg
bit.ly/JvD71E [MSDN Addy/Julian]
bit.ly/MIOIK2 [Intridea Defs post]
Quick Left (esp. Sam and Nico)

More Related Content

Viewers also liked

Viewers also liked (7)

Maravillas del Mar
Maravillas del MarMaravillas del Mar
Maravillas del Mar
 
Barcamps2
Barcamps2Barcamps2
Barcamps2
 
Mother
MotherMother
Mother
 
Lo Efimero
Lo EfimeroLo Efimero
Lo Efimero
 
Multitech's VOIP Solution
Multitech's VOIP SolutionMultitech's VOIP Solution
Multitech's VOIP Solution
 
Twittering the News
Twittering the NewsTwittering the News
Twittering the News
 
The Gentle Art of Persuasion - storytelling
The Gentle Art of Persuasion - storytellingThe Gentle Art of Persuasion - storytelling
The Gentle Art of Persuasion - storytelling
 

Similar to Jquery2012 defs

Why you should be using the shiny new C# 6.0 features now!
Why you should be using the shiny new C# 6.0 features now!Why you should be using the shiny new C# 6.0 features now!
Why you should be using the shiny new C# 6.0 features now!Eric Phan
 
Modern javascript
Modern javascriptModern javascript
Modern javascriptKevin Ball
 
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS EngineZongXian Shen
 
Spring framework
Spring frameworkSpring framework
Spring frameworkAircon Chen
 
DevLOVE Beautiful Development - 第一幕 陽の巻
DevLOVE Beautiful Development - 第一幕 陽の巻DevLOVE Beautiful Development - 第一幕 陽の巻
DevLOVE Beautiful Development - 第一幕 陽の巻都元ダイスケ Miyamoto
 
From Android NDK To AOSP
From Android NDK To AOSPFrom Android NDK To AOSP
From Android NDK To AOSPMin-Yih Hsu
 
Cross platform Mobile development on Titanium
Cross platform Mobile development on TitaniumCross platform Mobile development on Titanium
Cross platform Mobile development on TitaniumYiguang Hu
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)Doris Chen
 
ElasticSearch AJUG 2013
ElasticSearch AJUG 2013ElasticSearch AJUG 2013
ElasticSearch AJUG 2013Roy Russo
 
Archetype autoplugins
Archetype autopluginsArchetype autoplugins
Archetype autopluginsMark Schaake
 
Swift and Kotlin Presentation
Swift and Kotlin PresentationSwift and Kotlin Presentation
Swift and Kotlin PresentationAndrzej Sitek
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformationLars Marius Garshol
 
iOS and Android Acceptance Testing with Calabash - Xcake Dublin
iOS and Android Acceptance Testing with Calabash - Xcake DubliniOS and Android Acceptance Testing with Calabash - Xcake Dublin
iOS and Android Acceptance Testing with Calabash - Xcake Dublinroland99
 
Games for the Masses (Jax)
Games for the Masses (Jax)Games for the Masses (Jax)
Games for the Masses (Jax)Wooga
 
Concepts of Functional Programming for Java Brains (2010)
Concepts of Functional Programming for Java Brains (2010)Concepts of Functional Programming for Java Brains (2010)
Concepts of Functional Programming for Java Brains (2010)Peter Kofler
 
SEMAC 2011 - Apresentando Ruby e Ruby on Rails
SEMAC 2011 - Apresentando Ruby e Ruby on RailsSEMAC 2011 - Apresentando Ruby e Ruby on Rails
SEMAC 2011 - Apresentando Ruby e Ruby on RailsFabio Akita
 
Static Code Analysis PHP[tek] 2023
Static Code Analysis PHP[tek] 2023Static Code Analysis PHP[tek] 2023
Static Code Analysis PHP[tek] 2023Scott Keck-Warren
 
Introduction to Riak and Ripple (KC.rb)
Introduction to Riak and Ripple (KC.rb)Introduction to Riak and Ripple (KC.rb)
Introduction to Riak and Ripple (KC.rb)Sean Cribbs
 

Similar to Jquery2012 defs (20)

Why you should be using the shiny new C# 6.0 features now!
Why you should be using the shiny new C# 6.0 features now!Why you should be using the shiny new C# 6.0 features now!
Why you should be using the shiny new C# 6.0 features now!
 
Modern javascript
Modern javascriptModern javascript
Modern javascript
 
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine
 
Spring framework
Spring frameworkSpring framework
Spring framework
 
DevLOVE Beautiful Development - 第一幕 陽の巻
DevLOVE Beautiful Development - 第一幕 陽の巻DevLOVE Beautiful Development - 第一幕 陽の巻
DevLOVE Beautiful Development - 第一幕 陽の巻
 
From Android NDK To AOSP
From Android NDK To AOSPFrom Android NDK To AOSP
From Android NDK To AOSP
 
Cross platform Mobile development on Titanium
Cross platform Mobile development on TitaniumCross platform Mobile development on Titanium
Cross platform Mobile development on Titanium
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
 
ElasticSearch AJUG 2013
ElasticSearch AJUG 2013ElasticSearch AJUG 2013
ElasticSearch AJUG 2013
 
Archetype autoplugins
Archetype autopluginsArchetype autoplugins
Archetype autoplugins
 
Swift and Kotlin Presentation
Swift and Kotlin PresentationSwift and Kotlin Presentation
Swift and Kotlin Presentation
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformation
 
iOS and Android Acceptance Testing with Calabash - Xcake Dublin
iOS and Android Acceptance Testing with Calabash - Xcake DubliniOS and Android Acceptance Testing with Calabash - Xcake Dublin
iOS and Android Acceptance Testing with Calabash - Xcake Dublin
 
Games for the Masses (Jax)
Games for the Masses (Jax)Games for the Masses (Jax)
Games for the Masses (Jax)
 
Concepts of Functional Programming for Java Brains (2010)
Concepts of Functional Programming for Java Brains (2010)Concepts of Functional Programming for Java Brains (2010)
Concepts of Functional Programming for Java Brains (2010)
 
JS Essence
JS EssenceJS Essence
JS Essence
 
SEMAC 2011 - Apresentando Ruby e Ruby on Rails
SEMAC 2011 - Apresentando Ruby e Ruby on RailsSEMAC 2011 - Apresentando Ruby e Ruby on Rails
SEMAC 2011 - Apresentando Ruby e Ruby on Rails
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
Static Code Analysis PHP[tek] 2023
Static Code Analysis PHP[tek] 2023Static Code Analysis PHP[tek] 2023
Static Code Analysis PHP[tek] 2023
 
Introduction to Riak and Ripple (KC.rb)
Introduction to Riak and Ripple (KC.rb)Introduction to Riak and Ripple (KC.rb)
Introduction to Riak and Ripple (KC.rb)
 

Recently uploaded

Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetEnjoy Anytime
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsSnow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsHyundai Motor Group
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 

Recently uploaded (20)

E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsSnow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 

Jquery2012 defs

  • 1. .when() to use deferreds Alex McPherson - Quick Left
  • 4. console.log(talkOutline) • Who’s Alex McPherson • j@ubourg and some history
  • 5. console.log(talkOutline) • Who’s Alex McPherson • j@ubourg and some history • Code walkthrough
  • 6. console.log(talkOutline) • Who’s Alex McPherson • j@ubourg and some history • Code walkthrough • 6 problems, 6 solutions
  • 7. console.log(talkOutline) • Who’s Alex McPherson • j@ubourg and some history • Code walkthrough • 6 problems, 6 solutions • Best practices
  • 8. console.log(talkOutline) • Who’s Alex McPherson • j@ubourg and some history • Code walkthrough • 6 problems, 6 solutions • Best practices • Q &A
  • 10. alex.define() Important, life altering facts: • Sublime Text 2
  • 11. alex.define() Important, life altering facts: • Sublime Text 2 • Railscasts 2 color scheme
  • 12. alex.define() Important, life altering facts: • Sublime Text 2 • Railscasts 2 color scheme • Comma Last
  • 13. alex.define() Important, life altering facts: • Sublime Text 2 • Railscasts 2 color scheme • Comma Last • Always include semicolons
  • 14. alex.define() Important, life altering facts: • Sublime Text 2 • Boston to Boulder • Railscasts 2 color scheme • Comma Last • Always include semicolons
  • 15. alex.define() Important, life altering facts: • Sublime Text 2 • Boston to Boulder • Railscasts 2 color • Quick Left scheme • Comma Last • Always include semicolons
  • 16. alex.define() Important, life altering facts: • Sublime Text 2 • Boston to Boulder • Railscasts 2 color • Quick Left scheme • Front End • Comma Last • Always include semicolons
  • 17. alex.define() Important, life altering facts: • Sublime Text 2 • Boston to Boulder • Railscasts 2 color • Quick Left scheme • Front End • Comma Last • Training and CU • Always include semicolons
  • 18. alex.define() Skillset
  • 19. alex.define() Skillset • Fortune 500 Financial
  • 20. alex.define() Skillset • Fortune 500 Financial • Code performance
  • 21. alex.define() Skillset • Fortune 500 Financial • Code performance • IE6
  • 22. alex.define() Skillset • Fortune 500 Financial • Code performance • IE6
  • 23. alex.define() Skillset • Fortune 500 Financial • Code performance • IE6
  • 24. alex.define() Skillset • Fortune 500 Financial • Code performance • IE6
  • 25. alex.define() Skillset • Fortune 500 Financial • Code performance • IE6
  • 26. alex.define() Skillset • Fortune 500 Financial • Code performance • IE6
  • 27. alex.define() Skillset • Fortune 500 Financial • 1-3 month startups • Code performance • IE6
  • 28. alex.define() Skillset • Fortune 500 Financial • 1-3 month startups • Code performance • Get stuff done • IE6
  • 29. alex.define() Skillset • Fortune 500 Financial • 1-3 month startups • Code performance • Get stuff done • IE6 • Thick clients, Backbone.js, websockets
  • 31. deferred.history • November 2009, $.ajax requests
  • 32. deferred.history • November 2009, $.ajax requests • Julian Aubourg steps up, rewrites
  • 33. deferred.history • November 2009, $.ajax requests • Julian Aubourg steps up, rewrites • Suggested that internal API be exposed
  • 34. deferred.history • November 2009, $.ajax requests • Julian Aubourg steps up, rewrites • Suggested that internal API be exposed • Reworked, released January 2010
  • 35. deferred.history • November 2009, $.ajax • ‘Based on’ CommonJS requests Promises/A proposal • Julian Aubourg steps up, rewrites • Suggested that internal API be exposed • Reworked, released January 2010
  • 36. deferred.history • November 2009, $.ajax • ‘Based on’ CommonJS requests Promises/A proposal • Julian Aubourg steps up, • Used internally in rewrites jQuery, AJAX and effects • Suggested that internal API be exposed • Reworked, released January 2010
  • 37. deferred.history • November 2009, $.ajax • ‘Based on’ CommonJS requests Promises/A proposal • Julian Aubourg steps up, • Used internally in rewrites jQuery, AJAX and effects • Suggested that internal • How do we use it? API be exposed • Reworked, released January 2010
  • 40. code.inspect() What exactly is a $.Deferred()? State storage object:
  • 41. code.inspect() What exactly is a $.Deferred()? State storage object:
  • 42. code.inspect() What exactly is a $.Deferred()? ‘pending’
  • 43. code.inspect() What exactly is a $.Deferred()? ‘pending’
  • 44. code.inspect() What exactly is a $.Deferred()? ‘resolved’ ‘pending’
  • 45. code.inspect() What exactly is a $.Deferred()? ‘resolved’ ‘pending’
  • 46. code.inspect() What exactly is a $.Deferred()? ‘resolved’ ‘pending’ ‘rejected’
  • 47. code.inspect() What exactly is a $.Deferred()? ‘resolved’ ‘pending’ ‘rejected’
  • 48. code.inspect() What exactly is a $.Deferred()? ‘resolved’ ‘rejected’
  • 49. code.inspect() What exactly is a $.Deferred()? ‘resolved’ ‘rejected’
  • 50. code.inspect() What exactly is a $.Deferred()? ‘resolved’ ‘rejected’
  • 51. code.inspect() What exactly is a $.Deferred()? ‘resolved’ ‘rejected’
  • 52. code.inspect() What exactly is a $.Deferred()? ‘resolved’ ‘rejected’ }
  • 54. code.inspect() What exactly is a $.Deferred()? • .always(fn) • .done(fn) • .fail(fn)
  • 55. code.inspect() What exactly is a $.Deferred()? • .always(fn) • .done(fn) • .fail(fn) • .reject(ctx, args) • .rejectWith(ctx, args) • .resolve(ctx, args) • .resolveWith(ctx, args)
  • 56. code.inspect() What exactly is a $.Deferred()? • .always(fn) • .state() • .done(fn) • .isRejected() • .fail(fn) • .isResolved() • .reject(ctx, args) • .rejectWith(ctx, args) • .resolve(ctx, args) • .resolveWith(ctx, args)
  • 57. code.inspect() What exactly is a $.Deferred()? • .always(fn) • .state() • .done(fn) • .isRejected() • .fail(fn) • .isResolved() • .reject(ctx, args) • .pipe() • .rejectWith(ctx, args) • .then() • .resolve(ctx, args) • .when() • .resolveWith(ctx, args)
  • 59. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 60. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 61. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 62. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 63. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 64. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 65. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 66. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 67. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 68. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 69. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 70. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 71. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources
  • 72. 1. Bundling AJAX Calls Task at hand: Render a small sidebar with data from 3 different sources $.when returns one deferred to represent many
  • 73. 2. Template Pattern Task at hand: Single page app, some pages need data, others don’t
  • 74. 2. Template Pattern Task at hand: Single page app, some pages need data, others don’t
  • 75. 2. Template Pattern Task at hand: Single page app, some pages need data, others don’t
  • 76. 2. Template Pattern Task at hand: Single page app, some pages need data, others don’t
  • 77. 2. Template Pattern Task at hand: Single page app, some pages need data, others don’t
  • 78. 2. Template Pattern Task at hand: Single page app, some pages need data, others don’t Any object that isn’t a deferred can still be treated like one.
  • 79. 2. Template Pattern Task at hand: Single page app, some pages need data, others don’t Any object that isn’t a deferred can still be treated like one. It will get immediately resolved.
  • 80. 3.Cache Money Task at hand: Your app uses a rate limited API. Don’t go over!
  • 81. 3.Cache Money Task at hand: Your app uses a rate limited API. Don’t go over!
  • 82. 3.Cache Money Task at hand: Your app uses a rate limited API. Don’t go over!
  • 83. 3.Cache Money Task at hand: Your app uses a rate limited API. Don’t go over!
  • 84. 3.Cache Money Task at hand: Your app uses a rate limited API. Don’t go over!
  • 85. 3.Cache Money Task at hand: Your app uses a rate limited API. Don’t go over!
  • 86. 3.Cache Money Task at hand: Your app uses a rate limited API. Don’t go over! Callbacks attached to deferreds always get the same arguments
  • 87. 4. Pretty Syntax Task at hand: Make your javascript look awesome
  • 88. 4. Pretty Syntax Task at hand: Make your javascript look awesome a) setTimeout(500, myFunction) b) setTimeOut(myFunction, 500) c) setTimeOut(500, myFunction) d) setTimeout(myFunction, 500)
  • 89. 4. Pretty Syntax Task at hand: Make your javascript look awesome a) setTimeout(500, myFunction) b) setTimeOut(myFunction, 500) c) setTimeOut(500, myFunction) d) setTimeout(myFunction, 500) <<<
  • 90. 4. Pretty Syntax Task at hand: Make your javascript look awesome a) setTimeout(500, myFunction) b) setTimeOut(myFunction, 500) c) setTimeOut(500, myFunction) d) setTimeout(myFunction, 500) <<<
  • 91. 4. Pretty Syntax Task at hand: Make your javascript look awesome a) setTimeout(500, myFunction) b) setTimeOut(myFunction, 500) c) setTimeOut(500, myFunction) d) setTimeout(myFunction, 500) <<<
  • 92. 4. Pretty Syntax Task at hand: Make your javascript look awesome
  • 93. 4. Pretty Syntax Task at hand: Make your javascript look awesome
  • 94. 4. Pretty Syntax Task at hand: Make your javascript look awesome
  • 95. 4. Pretty Syntax Task at hand: Make your javascript look awesome
  • 96. 4. Pretty Syntax Task at hand: Make your javascript look awesome The natural-language syntax is already there, but feel free to add your own. Return promises
  • 97. 5.Arbitrary ‘events’ Task at hand: Get updates during a longer process
  • 98. 5.Arbitrary ‘events’ Task at hand: Get updates during a longer process
  • 99. 5.Arbitrary ‘events’ Task at hand: Get updates during a longer process
  • 100. 5.Arbitrary ‘events’ Task at hand: Get updates during a longer process
  • 101. 5.Arbitrary ‘events’ Task at hand: Get updates during a longer process
  • 102. 5.Arbitrary ‘events’ Task at hand: Get updates during a longer process
  • 103. 5.Arbitrary ‘events’ Task at hand: Get updates during a longer process
  • 104. 5.Arbitrary ‘events’ Task at hand: Get updates during a longer process
  • 105. 5.Arbitrary ‘events’ Task at hand: Get updates during a longer process
  • 106. 5.Arbitrary ‘events’ Task at hand: Get updates during a longer process .progress() callbacks fired with .notify() can let you get insight into long running processes $.Animation and HTML5 file upload
  • 107. 6. Managing Animations Task at hand: Implement a complex animation with tight tolerances Built in helper methods generate promises on their DOM nodes:
  • 108. 6. Managing Animations Task at hand: Implement a complex animation with tight tolerances Built in helper methods generate promises on their DOM nodes: • .animate() • .fadeIn() • .fadeOut() • .hide() • .show() • .slideUp() • .slideDown() • .Animate()
  • 109. 6. Managing Animations Task at hand: Implement a complex animation with tight tolerances
  • 110. 6. Managing Animations Task at hand: Implement a complex animation with tight tolerances
  • 111. 6. Managing Animations Task at hand: Implement a complex animation with tight tolerances
  • 112. 6. Managing Animations Task at hand: Implement a complex animation with tight tolerances
  • 113. 6. Managing Animations Task at hand: Implement a complex animation with tight tolerances
  • 114. 6. Managing Animations Task at hand: Implement a complex animation with tight tolerances Syncing multiple animations is hard without deferreds
  • 115. Things I didn’t even mention but are still awesome:
  • 116. Things I didn’t even mention but are still awesome: • Registering multiple callbacks!
  • 117. Things I didn’t even mention but are still awesome: • Registering multiple callbacks! • Post-resolution binding!
  • 118. Things I didn’t even mention but are still awesome: • Registering multiple callbacks! • Post-resolution binding! • Helpful .then(d, f) shortcut syntax!
  • 119. Things I didn’t even mention but are still awesome: • Registering multiple callbacks! • Post-resolution binding! • Helpful .then(d, f) shortcut syntax! • Dependent AJAX calls!
  • 120. Things I didn’t even mention but are still awesome: • Registering multiple callbacks! • Post-resolution binding! • Helpful .then(d, f) shortcut syntax! • Dependent AJAX calls! • Memoizing expensive operations!
  • 121. Things I didn’t even mention but are still awesome: • Registering multiple callbacks! • Post-resolution binding! • Helpful .then(d, f) shortcut syntax! • Dependent AJAX calls! • Memoizing expensive operations! • Implementing a publisher/subscriber pattern!
  • 123. Deferred best practices • When in doubt, return a deferred
  • 124. Deferred best practices • When in doubt, return a deferred • Better yet, return a .promise()
  • 125. Deferred best practices • When in doubt, return a deferred • Better yet, return a .promise() • Powerful as properties on objects
  • 126. Deferred best practices • When in doubt, return a deferred • Better yet, return a .promise() • Powerful as properties on objects • Make you code prettier
  • 127. Deferred best practices • When in doubt, return a deferred • Better yet, return a .promise() • Powerful as properties on objects • Make you code prettier • Make your life easier
  • 129. What we covered: • Bundling AJAX calls together
  • 130. What we covered: • Bundling AJAX calls together • Normalizing by using .done on non-deferreds
  • 131. What we covered: • Bundling AJAX calls together • Normalizing by using .done on non-deferreds • Implementing cache objects
  • 132. What we covered: • Bundling AJAX calls together • Normalizing by using .done on non-deferreds • Implementing cache objects • Prettier syntax and DSLs
  • 133. What we covered: • Bundling AJAX calls together • Normalizing by using .done on non-deferreds • Implementing cache objects • Prettier syntax and DSLs • Progress on long-running operations
  • 134. What we covered: • Bundling AJAX calls together • Normalizing by using .done on non-deferreds • Implementing cache objects • Prettier syntax and DSLs • Progress on long-running operations • Manage animations
  • 135. talk.resolve() • @alexmcpherson • McPhersonIndustries.com Credits: j@ubourg bit.ly/JvD71E [MSDN Addy/Julian] bit.ly/MIOIK2 [Intridea Defs post] Quick Left (esp. Sam and Nico)

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n