Nehmen wir an, ich habe eine Funktion, innerhalb der ich auf eine Schnittstelle (in diesem Fall Mungo) zugreifen, die ich nicht ändern kann. Die Schnittstelle gibt eine Zusage zurück, die nur in der gefundenen Ressource übergeben wird.Entwurfsmuster für die Behandlung von Argumenten in externen Schnittstellen mit Versprechen
show = function(response) {
Resource.findById(req.params.id).then(renderResource);
}
function renderResource(resource) {
// render the response
}
Um die Antwort zu machen, muß ich von der show
Funktion Zugriff auf die response
Parameter haben. Ich kann das in der Verwendung der bind
Funktion bekommen, Hijacking this
, um die Antwortvariable zu sein;
show = function(response) {
Resource.findById(req.params.id).then(renderResource.bind(response));
}
function renderResource(resource) {
this.send(resource);
}
Aber was ist, wenn ich ein anderes Argument in die renderResource
Funktion übergeben möchten? Der einzige Weg, wie ich es geschafft habe, ist so;
show = function(response) {
Resource.findById(req.params.id).then(function(resource) {
renderResource.call(response, resource, "foo"));
}
}
function renderResource(resource, otherArg) {
this.send(resource);
//do something with otherArg
}
Aber an diesem Punkt bin ich nicht mehr glücklich mit dem Code weil;
call
rein, so kann ich immer noch this
in der Funktion verwenden, aber tatsächlich durch die Zeit, die wir so weit sind, kann ich auch nur response
als dritte Arg übergeben.Ich bin mir sicher, dass es ein Muster oder etwas geben muss, um dieses Problem auf eine sauberere Weise zu behandeln, ohne ein neues Funktionsliteral deklarieren zu müssen. Kann jemand ein Muster vorschlagen? Gibt es einen besseren Umgang mit dieser Situation?
Mit Funktionsliteralen nichts mit Callback-Hölle zu tun hat - Sie nicht haben um sie zu nisten, wenn sie mit Versprechen arbeiten. Verschlüsse sind völlig in Ordnung, und der empfohlene Ansatz für Ihr Problem! – Bergi