2016-04-08 2 views
0

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;

  • Ich hatte eine Funktion Literal zu deklarieren, und sind auf unserem Weg zur Rückruf-Hölle.
  • Ich benutze 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?

    +1

    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

    Antwort

    2

    Sie können so viele Argumente an bind übergeben, wie Sie benötigen. Ich würde vermeiden, this als eine Möglichkeit zu verwenden, Argumente zu übergeben, um Verwirrung zu vermeiden.

    show = function(response) { 
        Resource.findById(req.params.id) 
        .then(renderResource.bind(null, response, "foo")); 
    } 
    
    function renderResource(response, otherArg, resource) { 
        response.send(resource); 
        //do something with otherArg 
    } 
    

    Siehe bind Dokumentation für weitere Informationen:
    https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

    Dies als partical Anwendung bekannt ist:
    https://en.wikipedia.org/wiki/Partial_application

    +0

    Danke, funktioniert wie ein Charme –

    Verwandte Themen