Need To Hook Into A Javascript Function Call, Any Way To Do This?
I'm trying to hook into a function that loads Facebook's news feed: UIIntentionalStream.instance && UIIntentionalStream.instance.loadOlderPosts(); on Facebook.com. Is ther
Solution 1:
A more complete method will be:
var old = UIIntentionalStream.instance.loadOlderPosts;
UIIntentionalStream.instance.loadOlderPosts = function(arguments) {
// hook before callvar ret = old.apply(this, arguments);
// hook after callreturn ret;
};
This makes sure that if loadOlderPosts
is expecting any parameters or using this, it will get the correct version of them as well as if the caller expects any return value it will get it
Solution 2:
Try something like this:
var old = UIIntentionalStream.instance.loadOlderPosts;
UIIntentionalStream.instance.loadOlderPosts = function() {
// hook before callold();
// hook after call
};
Just hook in wherever you want, before or after the original function's call.
Solution 3:
Expanding on the previous posts: I have created a function that you can call to perform this "hooking" action.
hookFunction(UIIntentionalStream.instance, 'loadOlderPosts', function(){
/* This anonymous function gets called after UIIntentionalStream.instance.loadOlderPosts() has finished */doMyCustomStuff();
});
// Define this function so you can reuse it later and keep your overrides "cleaner"functionhookFunction(object, functionName, callback) {
(function(originalFunction) {
object[functionName] = function () {
var returnValue = originalFunction.apply(this, arguments);
callback.apply(this, [returnValue, originalFunction, arguments]);
return returnValue;
};
}(object[functionName]));
}
Bonus: You should also wrap this all a closure, for good measure.
Solution 4:
Similar to Eric's answer above. When using ES6, this function works for both async and sync functions:
exportfunctioncreateHook(obj, targetFunction, hookFunction) {
let temp = obj[targetFunction]
obj[targetFunction] = function (...args) {
let ret = temp.apply(this, args)
if (ret && typeof ret.then === 'function') {
return ret.then((value)=>{hookFunction([value, args]); return value;})
} else {
hookFunction([ret, args])
return ret
}
}
}
Post a Comment for "Need To Hook Into A Javascript Function Call, Any Way To Do This?"