Ich habe die folgende selbst aufgerufene Funktion, die von den anderen Funktionen in der App verwendet wird:

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

Diese Funktion wird von anderen Funktionen in der App aufgerufen wie:

Api.getResponsePayload();

Ich möchte die Ausgabe der Funktion getResponsePayload jedes Mal erfassen, wenn diese Funktion zur weiteren Verwendung aufgerufen wird.

Ich habe versucht, eine andere Funktion zu erstellen:

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

Und es wird jedes Mal aufgerufen, wenn die Funktion getResponsePayload aufgerufen wird, aber die Ausgabe, die ich erhalte, ist undefined:

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

Wie kann ich die Ausgabe der Funktion getResponsePayload jedes Mal abrufen, wenn sie von einer anderen Funktion in der App aufgerufen wird?

0
Hannan 18 Apr. 2018 im 18:44

3 Antworten

Beste Antwort

Shim es einfach, vorausgesetzt, dies ist für Debug-Zwecke. Möglicherweise möchten Sie Ausnahmen expliziter behandeln. Stellen Sie jedoch sicher, dass Sie sie erneut ausführen, um transparent zu sein.

Api.getResponsePayload = (function(previousFn){
  return function() {
    var result = previousFn.apply(this, arguments);
    // print them or something
    return result;
  }
})(Api.getResponsePayload)

Bearbeiten: Hier ist eine Verallgemeinerung der obigen Methode:

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');
2
Eric 18 Apr. 2018 im 19:36

Sie könnten Rückrufe verwenden. Ich bin mir nicht sicher, ob Sie einen Rückruf im get oder im Set wünschen. Dieses Beispiel zeigt beides.

Erics Antwort ist eleganter und kann auch verwendet werden, wenn Api ein externes Objekt ist. Ich denke jedoch, dass diese einfachere Implementierung für Lernzwecke nützlich sein könnte.

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);
}
2
raul.vila 18 Apr. 2018 im 16:02

Sie übergeben keinen Parameter an runMe, sodass die Protokollierung undefiniert erfolgt. Ändern Sie Ihre getResponsePayload Funktion in:

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

Beachten Sie jedoch, dass die Konsolenausgabe immer noch undefiniert ist, wenn Sie responsePayload nicht festlegen, da responsePayload nur deklariert, aber niemals ein Wert zugewiesen wird (daher hat sie den Wert undefined).

1
Dario 18 Apr. 2018 im 15:51