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 ?
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 ?
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.
Leggi altre domande sui tag javascript