Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TDC2013 - Programação assíncrona com Javascript

TDC2013 - Programação assíncrona com Javascript

Palestra sobre programação assíncrona com Javascript no TDC2013 em Floripa, na trilha de HTML5/Javascript

Breno Ferreira

May 27, 2013
Tweet

More Decks by Breno Ferreira

Other Decks in Technology

Transcript

  1. Em JS, nosso código é assíncrono Afinal, só temos 1

    thread, e não podemos nos dar ao luxo de esperar algo terminar.
  2. Quem nunca fez isso? (Piramid of Doom) $.get('http:/ /whateverjson.com', {

    ! success: function(json1){ ! ! ... ! ! $.post('http:/ /xpto.com', data, { ! ! ! ... ! ! ! success: function(res){ ! ! ! ! $.get('http:/ /anotherjson.com', { ! ! ! ! ! success: function(json2){ ! ! ! ! ! ! .... ! ! ! ! ! } ! ! ! ! }); ! ! ! } ! ! }); ! } });
  3. Callbacks são úteis Mas qualquer coisa além disso, torna-se complexo

    fazer coisas simples. app.put('/todos/:id', function(req, res){ //Código em Node.JS para update no MongoDB getTodosCollection().findById(req.params.id, function(err, item){ if(err) res.send(500, ‘Erro ao atualizar os dados’); else { todo = item; todo.completed = req.body.completed; getTodosCollection().save(todo, function(err, item){ if(err) res.send(500, ‘Erro ao atualizar os dados’); else res.send(item); }); } }); });
  4. Promises A promise represents the eventual value returned from the

    single completion of an operation. http:/ /wiki.commonjs.org/wiki/Promises/A
  5. $.Deferred var asyncOp = function(){ var deferred = $.Deferred(); setTimeout(function(){

    deferred.resolve('done'); }, 1000); return deferred.promise(); };
  6. $.Deferred var asyncOp = function(){ var deferred = $.Deferred(); setTimeout(function(){

    deferred.reject('error'); }, 1000); return deferred.promise(); };
  7. $.Deferred - Continuations $.ajax(....) ! .then(function(resultado){ ! / /faz alguma

    coisa com resultado ! return $.ajax(...); / /outra ação async ! }) ! .then(function(outroResultado){ ! / /faz outra coisa com outro resultado ! }) ! .fail(function(erro){ ! / /erro caso qualquer operação falhe ! });
  8. $.Deferred - when var d1 = $.get('search.twitter.com/search.json?q=TDC2013'); var d2 =

    $.get('search.twitter.com/search.json?q=Floripa'); var d3 = $.get('search.twitter.com/search.json?q=Javascript'); $.when(d1, d2, d3) .done(function(tdc, floripa, jurere){ ... });
  9. Iterator x Observer interface IEnumerable<T> { ! IEnumerator<T> GetEnumerator(); }

    interface IEnumerator<T> { ! bool MoveNext(); / / throws Exception ! T Current { get; } }
  10. Iterator x Observer interface IObservable<T> { ! IEnumerator<T> GetEnumerator(); }

    interface IEnumerator<T> { ! bool MoveNext(); / / throws Exception ! T Current { get; } }
  11. Iterator x Observer interface IObservable<T> { ! IEnumerator<T> GetEnumerator(); }

    interface IObserver<T> { ! bool MoveNext(); / / throws Exception ! T Current { get; } }
  12. Iterator x Observer interface IObservable<T> { ! void Subscribe(IObserver<T> observer)

    } interface IObserver<T> { ! bool MoveNext(); / / throws Exception ! T Current { get; } }
  13. Iterator x Observer interface IObservable<T> { ! void Subscribe(IObserver<T> observer)

    } interface IObserver<T> { ! void OnNext(T item) ! T Current { get; } }
  14. Iterator x Observer interface IObservable<T> { ! void Subscribe(IObserver<T> observer)

    } interface IObserver<T> { ! void OnNext(T item) ! void OnError(Exception ex) }
  15. Iterator x Observer interface IObservable<T> { ! void Subscribe(IObserver<T> observer)

    } interface IObserver<T> { ! void OnNext(T item) ! void OnError(Exception ex) void OnCompleted() }
  16. O verdadeiro poder do Rx filtros (where, distinct, skip, take,

    all, any) agregações (count, min, max, avg, sum, aggregate, scan) Transformações (map, flatMap) Combinações (concat, merge, zip) Schedulers You don’t know the power of Rx (yet)
  17. Fatality var sequencia = [ 38, / / up 38,

    / / up 40, / / down 40, / / down 37, / / left 39, / / right 37, / / left 39, / / right 66, / / b 65 / / a ];
  18. Fatality Rx.Observable.fromEvent(document, 'keyup') .select(function (e) { return e.keyCode; / /

    pega o keycode }) .bufferWithCount(10) / / ultimos 10 .where(function (input) { return arrayEquals(sequencia, input); }) / / sequencia correta .subscribe(function () { alert('FATALITY!'); / / FATALITY! });
  19. Mouse drag var mouseDown = Rx.Observable .fromEvent(canvas, 'mousedown') var mouseMove

    = Rx.Observable .fromEvent(canvas, 'mousemove') .map(function(e){ return getInputCoordinates(e); }); var mouseUp = Rx.Observable .fromEvent(canvas, 'mouseup');
  20. Quem usa? Netflix - Usado para serviços internos assíncronos. Escrito

    em Java Github - Cliente para Windows (C#) e Mac (Objective-C) SQL Server Stream Insight
  21. Open-Source http:/ /rx.codeplex.com/ (.NET, JS, C++) https:/ /github.com/Netflix/RxJava (Java, Scala,

    Groovy, Clojure, JRuby) https:/ /github.com/ReactiveCocoa/ ReactiveCocoa (Objective-C)
  22. Aprenda mais http:/ /www.introtorx.com (C#) http:/ /channel9.msdn.com/tags/Rx/ http:/ /rxwiki.wikidot.com/101samples http:/

    /csl.stanford.edu/~christos/pldi2010.fit/ meijer.duality.pdf (Paper do Erik Meijer sobre dualidade de IEnumerable x IObservable)