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中找到更多关于类似概念的信息。谢谢;你可以找到更多关于类似概念的信息从…起