JS:每次调用函数时如何捕获函数的输出

时间:2018-04-18 15:44:38

标签: javascript

我有以下自调用函数,该函数正在应用程序中的其他函数中使用:

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);
    }
  };           
}());

此功能由应用程序中的其他功能调用,如:

Api.getResponsePayload();

每次调用此函数进行进一步处理时,我想捕获getResponsePayload函数的输出。

我尝试创建另一个函数:

function runMe(responsePayload) {
    console.log(responsePayload)
}

每次调用getResponsePayload函数时都会调用它,但我得到的输出是undefined

getResponsePayload: function() {
    runMe();
return responsePayload;

每次应用程序中的任何其他函数调用时,如何获取getResponsePayload函数的输出?

3 个答案:

答案 0 :(得分:2)

您可以使用回调。我不确定你是否在get或set中进行了回调,这个例子显示了这两个回调。

Eric's answer更优雅,即使Api是外部对象也可以使用。但我认为这个更简单的实现可能对学习目的有用。

&#13;
&#13;
var Api = (function(getResponsePayloadCallback, setResponsePayloadCallback) {
  var requestPayload;
  var responsePayload;

  return {
	getRequestPayload: function() {
	  return requestPayload;
	},
	setRequestPayload: function(newPayloadStr) {
	  requestPayload = JSON.parse(newPayloadStr);
	},
	getResponsePayload: function() { // <-Function's output I need
	  getResponsePayloadCallback(responsePayload);
	  return responsePayload;
	},
	setResponsePayload: function(newPayloadStr) {
	  responsePayload = JSON.parse(newPayloadStr);
	  setResponsePayloadCallback(responsePayload);
	}
  };           
})(getResponsePayloadHandler, setResponsePayloadHandler);

Api.setResponsePayload('{ "foo": "foo value" }');
var requestPayload = Api.getResponsePayload();

function getResponsePayloadHandler(value) {
  console.log("getResponsePayload: " + value.foo);
}

function setResponsePayloadHandler(value) {
  console.log("setResponsePayload: " + value.foo);
}
&#13;
&#13;
&#13;

答案 1 :(得分:2)

只是填充它,假设这是出于调试目的。您可能希望更明确地处理异常,只需确保重新抛出透明。

&#xA;&#xA;
  Api.getResponsePayload =(function(previousFn){&#xA; return function(){&#xA; var result = previousFn.apply(this,arguments);&#xA; //打印它们或&#xA;返回结果;&#xA;}&#xA;})(Api .getResponsePayload)&#xA;  
&#xA;&#xA;

编辑:以下是上述方法的概括:

&#xA;&#xA; < pre> function logMethodCallsOn(object,methodName){&#xA; var actualMethod = object [methodName];&#xA; object [methodName] = function(){&#xA; var title = methodName +“(”+ Array.prototype.map.call(arguments,function(val){return JSON.stringify(val);})。join(“,”)+“)”;&#xA;试试{&#xA; var result = actualMethod.apply(this,arguments);&#xA; console.log(title +“=”,result);&#xA;返回结果;&#xA; } catch(e){&#xA; console.error(title +“thrrew”,e);&#xA;扔(e)中;&#XA; }&#XA; }&#xA;}&#xA;&#xA; logMethodCallsOn(Api,'getResponsePayload');&#xA; logMethodCallsOn(Api,'setResponsePayload');&#xA; &# XA;

答案 2 :(得分:1)

您没有将任何参数传递给runMe,因此它会记录未定义。将您的getResponsePayload功能更改为:

getResponsePayload: function() {
    runMe(responsePayload);
    return responsePayload;
}

无论如何要注意,如果你没有设置responsePayload,你的控制台输出仍然是未定义的,因为responsePayload仅被声明但从未被赋值(因此它将具有undefined值)