2011-03-28 9 views
7

Me encontré usando una forma extraña de agregar funciones de devolución de llamada a mis funciones y me preguntaba si hay una manera más genérica de agregar devoluciones de llamadas a funciones, en el mejor de los casos tendría una situación donde todos mis funciones comprueban que el último parámetro dado es una función y, de ser así, utilícenlo como devolución de llamada.agregando devolución de llamada a la función - siempre

Esta es la forma en que lo hice en el pasado:

var myFunc = function(obj) { 

    if (arguments.length > 0) { 
    if (_.util.typeofObj(arguments[arguments.length-1]) === Function) { 
     var callback = arguments[arguments.length-1]; 
    } 
    } 

    // some code ... 

    if (callback !== undefined) { 
    callback(); 
    } 

}; 

var foo = myFunc(myObj, function(){ 
    alert('Callback!'); 
}); 

¿Alguna sugerencia?

Respuesta

5

Puede, si realmente quiere, extender Function.prototype con un prototipo .cb. Algo así como:

Function.prototype.cb = function(cb){ 
    var self = this; 
    return function(){ 
     self.callback = cb || function(){}; 
     self.apply(self, arguments); 
    } 
} 

entonces su código comprimiría a:

var myFunc = function(obj){ 
    // some code 

    this.callback(); // callback will always be defined 
} 

y la llamada cambiaría ligeramente:

myFunc.cb(function(){ 
    // callback code 
})(myObj); 

Es sólo una idea. Puedes hacer la sintaxis más o menos como quieras.

+0

perfecto, esa fue la idea, thx – ezmilhouse

+0

En este caso, podría no importar mucho, sin embargo, podría querer evitar el uso de 'self' ya que es una variable global (pero no está reservada). – Shaz

5

No está seguro de lo que está tratando de hacer aquí, sino una manera de añadir una devolución de llamada que parece más sencillo:

function(obj, callback) { 
    if(callback) { 
     callback(); 
    } 
} 
+0

O para causar algún rascarse la cabeza, abreviar como '&& devolución de llamada de devolución de llamada()' – Jacob

+8

@Jackob: "función" && de devolución de llamada de devolución de llamada == typeof() es más limpio – Andrey

+0

THX Andrei, supongo mejor solución si se utiliza params – ezmilhouse

13

prefiero un parámetro formal:

var myFunc = function(obj, callback) { 
    ... 
} 

De esta manera se hace obvio que hay una devolución de llamada. Tampoco tiene que perder el tiempo con el objeto arguments; simplemente puede verificar si callback es undefined, y luego verificar si es del tipo apropiado (Function).

+1

después de usar la solución prototipo de hace algunas semanas, cambié a su consejo, es más fácil de leer, descubro que es un eyecatcher muy importante – ezmilhouse

+0

@ezmilhouse sí, hay menos "magia" sucediendo porque el parámetro formal es obvio :) –

+0

@ ezmilhouse Sugiero cambiar la respuesta aceptada ya que mencionaste que cambiaste tu enfoque. –

Cuestiones relacionadas