Aggiunta di una richiamata a una funzione?

2

C'è un modo per aggiungere una richiamata a una determinata funzione javascript senza modificarne la definizione? Questo può essere fatto senza usare una libreria come differita ?

    
posta Kinnard Hockenhull 01.11.2013 - 04:25
fonte

1 risposta

6

Puoi fare in modo che qualsiasi funzione abbia una callback in javascript usando la seguente funzione:

//takes a function fn, and returns a function that is exactly the same as fn
//except that it also takes a callback as the last argument
//and calls that callback with the return value of fn 
function makeCallbacked(fn){
  return function(){
    var callback = arguments[arguments.length-1];
    var args = Array.prototype.slice.call(arguments, 0, arguments.length-1);
    var result = fn.apply(this, args);
    callback(result);
    return result;
  }
}

Esempio nella console:

> var test = makeCallbacked(function(a,b){ return a + b });
undefined
> test(1,2,function(result){ console.log("result: "+result); });
result: 3
3   

Se vuoi rinviare i callback, puoi fare la leggera modifica:

//takes a function fn, and returns a function that is exactly the same as fn
//except that it also takes a callback as the last argument
//and defers a call to that callback with the return value of fn
//note that it may take a very long time for the callback to be called 
function makeCallbacked(fn){
  return function(){
    var callback = arguments[arguments.length-1];
    var args = Array.prototype.slice.call(arguments, 0, arguments.length-1);
    var result = fn.apply(this, args);

    setTimeout(function(){
      callback(result);
    }, 0);

    return result;
  }
}

Esempio nella console:

> var test = makeCallbacked(function(a,b){ return a + b });
undefined
> test(1,2,function(result){ console.log("result: "+result); });
3   
result: 3

Si noti che questa è fondamentalmente una cosa davvero stupida da scrivere, poiché di solito si desidera passare a una richiamata più informazioni interessanti rispetto a un valore di ritorno e si desidera che la funzione abbia probabilmente un controllo migliore su quando viene richiamata la richiamata. Cambiare semplicemente la funzione è probabilmente la migliore. È anche un enorme spreco di risorse, se ti interessa questo genere di cose.

    
risposta data 01.11.2013 - 05:43
fonte

Leggi altre domande sui tag