Javascript JS:如何在每次调用函数时捕获其输出
我有以下自调用功能,应用程序中的其他功能正在使用该功能:Javascript JS:如何在每次调用函数时捕获其输出,javascript,Javascript,我有以下自调用功能,应用程序中的其他功能正在使用该功能: var Api = (function() { var requestPayload; var responsePayload; return { getRequestPayload: function() { return requestPayload; }, setRequestPayload: function(newPayloadStr) { requestPayloa
var Api = (function() {
var requestPayload;
var responsePayload;
return {
getRequestPayload: function() {
return requestPayload;
},
setRequestPayload: function(newPayloadStr) {
requestPayload = JSON.parse(newPayloadStr);
},
getResponsePayload: function() { // <-Function's output I need
return responsePayload;
},
setResponsePayload: function(newPayloadStr) {
responsePayload = JSON.parse(newPayloadStr);
}
};
}());
每次调用此函数时,我都要捕获getResponsePayload
函数的输出,以便进一步处理
我尝试创建另一个函数:
function runMe(responsePayload) {
console.log(responsePayload)
}
每次调用getResponsePayload
函数时,它都会被调用,但我得到的输出是未定义的
:
getResponsePayload: function() {
runMe();
return responsePayload;
每次应用程序中的任何其他函数调用
getResponsePayload
函数时,如何获取该函数的输出?您没有向运行库传递任何参数,因此它记录为未定义。将getResponsePayload
函数更改为:
getResponsePayload: function() {
runMe(responsePayload);
return responsePayload;
}
无论如何,请注意,如果不设置responsePayload
,控制台输出仍将是未定义的,因为responsePayload
只声明了一个值,但从未分配过一个值(因此它将具有未定义的值)您没有向运行时传递任何参数,因此它记录未定义的值。将getResponsePayload
函数更改为:
getResponsePayload: function() {
runMe(responsePayload);
return responsePayload;
}
无论如何,请注意,如果不设置responsePayload
,您的控制台输出仍将是未定义的,因为responsePayload
仅声明,但从未分配值(因此它将具有未定义的值)您可以使用回调。我不确定在get或set中是否有回调,这个示例显示了两者
更优雅,即使Api
是外部对象也可以使用。但我认为这种更简单的实现对于学习目的可能是有用的
var-Api=(函数(getResponsePayloadCallback,setResponsePayloadCallback){
有效载荷;
var反应性负载;
返回{
getRequestPayload:函数(){
返回请求有效载荷;
},
setRequestPayload:函数(newPayloadStr){
requestPayload=JSON.parse(newPayloadStr);
},
getResponsePayload:function(){/您可以使用回调。我不确定您在get或set中是否没有回调,此示例同时显示了这两种回调
更优雅,即使Api
是一个外部对象也可以使用。但我认为这个更简单的实现对于学习目的可能有用
var-Api=(函数(getResponsePayloadCallback,setResponsePayloadCallback){
有效载荷;
var反应性负载;
返回{
getRequestPayload:函数(){
返回请求有效载荷;
},
setRequestPayload:函数(newPayloadStr){
requestPayload=JSON.parse(newPayloadStr);
},
getResponsePayload:function(){/只要填充它,假设这是为了调试目的。您可能希望更明确地处理异常,只要确保重新填充以使其透明即可
Api.getResponsePayload = (function(previousFn){
return function() {
var result = previousFn.apply(this, arguments);
// print them or something
return result;
}
})(Api.getResponsePayload)
编辑:以下是上述方法的概括:
function logMethodCallsOn(object, methodName) {
var actualMethod = object[methodName];
object[methodName] = function() {
var title = methodName + "(" + Array.prototype.map.call(arguments, function (val) { return JSON.stringify(val); }).join(", ") + ")";
try {
var result = actualMethod.apply(this, arguments);
console.log(title + " =", result);
return result;
} catch (e) {
console.error(title + " threw", e);
throw(e);
}
}
}
logMethodCallsOn(Api, 'getResponsePayload');
logMethodCallsOn(Api, 'setResponsePayload');
假设这是为了调试目的,只需对其进行填充即可。您可能希望更明确地处理异常,只需确保重新填充以使其透明即可
Api.getResponsePayload = (function(previousFn){
return function() {
var result = previousFn.apply(this, arguments);
// print them or something
return result;
}
})(Api.getResponsePayload)
编辑:以下是上述方法的概括:
function logMethodCallsOn(object, methodName) {
var actualMethod = object[methodName];
object[methodName] = function() {
var title = methodName + "(" + Array.prototype.map.call(arguments, function (val) { return JSON.stringify(val); }).join(", ") + ")";
try {
var result = actualMethod.apply(this, arguments);
console.log(title + " =", result);
return result;
} catch (e) {
console.error(title + " threw", e);
throw(e);
}
}
}
logMethodCallsOn(Api, 'getResponsePayload');
logMethodCallsOn(Api, 'setResponsePayload');
我相信这可能是一个输入错误。但让我们看看OP对您的解决方案有何反应。:)是的,它对我起了作用,我今天有点笨。有没有更好的方法来做我想做的事情?不知怎的,我打电话给runMe()感觉不太好函数中的函数。有什么建议吗?我相信这可能是一个输入错误。但让我们看看OP对您的解决方案有何反应。:)是的,它对我起了作用,我今天有点笨。有没有更好的方法来做我想做的事?不知何故,我觉得调用runMe()不太好函数中的函数。有什么建议吗?谢谢;它也可以使用条件断点来完成,如果这是为了调试而不是审核=)不确定特定的API是否值得改进。谢谢,Eric的解决方案为我提供了技巧,但你的解决方案非常有用。谢谢;它也可以使用条件断点来完成eakpoint,如果这是用于调试而不是审计=)不确定特定的API是否值得改进Lol谢谢,Eric的解决方案为我提供了技巧,但你的解决方案非常有用。这是genius。谢谢;你可以从这是genius中找到更多关于类似概念的信息。谢谢;你可以找到更多关于类似概念的信息从…起