我有以下自调用函数,该函数正在应用程序中的其他函数中使用:
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
函数的输出?
答案 0 :(得分:2)
您可以使用回调。我不确定你是否在get或set中进行了回调,这个例子显示了这两个回调。
Eric's answer更优雅,即使Api
是外部对象也可以使用。但我认为这个更简单的实现可能对学习目的有用。
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;
答案 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
值)