Familien Schøler's blog

Lidt af hvert – blogbart eller ej, så er der en lille risiko for at du finder det her

Javascript callback’s

Nu har jeg manglet en god kilde til et minimalistisk javascript callback eksempel i et stykke tid, så jeg har derfor bidt i det sure æble og strukket et sådanne sammen selv.

  1. var foo = {
  2.  fooCallback: null,
  3.  setCallback: function(callback) {
  4.   this.fooCallback = callback;
  5.  },
  6.  doCallback: function() {
  7.   with (this) {
  8.    if (typeof fooCallback == "function") {
  9.     fooCallback();
  10.    } else {
  11.     alert("No foo callback defined.");
  12.    }
  13.   }
  14.  }
  15. };
  16.  
  17. var bar = {
  18.  barValue: 42,
  19.  callback: function() {
  20.   with (bar) {
  21.    alert("Success: bar.callback was called!\n"+
  22.     "And the bar value is " + barValue);
  23.   }
  24.  }
  25. };
  26.  
  27. foo.doCallback();
  28. foo.setCallback(bar.callback);
  29. foo.doCallback();

Se eksempel

Man skal lige have tungen lige i munden med hensyn til binding. Bemærk at der inde i bar.callback ikke benyttes “with(this)” men istedet “with(bar)” for at have rette scope når callback funktionen kaldes fra foo objektet.

Herunder er en udgave der kan have multiple callback registreret, og som tager højde for binding og dermed ”besværliggører” syntaxen for at tilføje callback funktionerne en smule.  Det kræves nemlig at .apply( obj ) kaldes på den callback man tilføjer for at binding scope kan gøres irrelevant inde i selve callback funktionen.

  1. var foo = {
  2.  fooCallbacks: [],
  3.  addCallback: function(callback) {
  4.   this.fooCallbacks.push(callback);
  5.  },
  6.  doCallback: function() {
  7.   with (this) {
  8.    var i, c = fooCallbacks.length;
  9.    for (i = 0; i < c; i++) {
  10.     if (typeof fooCallbacks[i] == "function") {
  11.      fooCallbacks[i]();
  12.     }
  13.    }
  14.   }
  15.  }
  16. };
  17.  
  18. var bar = {
  19.  barValue: 42,
  20.  callback: function() {
  21.   with (this) {
  22.    alert("Success: bar.callback was called!\n"+
  23.     "And the bar value is " + barValue);
  24.    barValue++;
  25.   }
  26.  },
  27.  callback2: function() {
  28.   with (this) {
  29.    alert("Success: bar.callback2 was called!\n"+
  30.     "And the bar value is " + barValue);
  31.   }
  32.  }
  33. };
  34.  
  35. foo.addCallback(bar.callback.apply(bar));
  36. foo.addCallback(bar.callback2.apply(bar));
  37. foo.doCallback();

Se eksempel

Send en kommentar