2015-10-20 2 views
5

Dies ist eine lange Geschichte, aber ich frage mich, ob es so etwas wie die C++ std :: bind in Javascript oder node.js gibt? Hier ist das Beispiel, in dem ich die Notwendigkeit einer Bindung fühlte:Gibt es ein Äquivalent von std :: bind in Javascript oder node.js?

var writeResponse = function(response, result) { 
    response.write(JSON.stringify(result)); 
    response.end(); 
} 


app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, function(result) { 
     res.write(JSON.stringify(result)); 
     res.end(); 
    }); 
}); 

Statt den Rückruf von vorbei dbaccesss.exec, ich möchte einen Funktionszeiger zu übergeben, die einen Parameter. In C++ Ich würde dies passieren:

std::bind(writeResponse, res) 

Diese in einer Funktion führen würde, die einen Parameter (das ‚Ergebnis‘ in meinem Fall) hat, die ich anstelle des anonymen Callback passieren könnte. Momentan kopiere ich den gesamten Code in der anonymen Funktion für jede Route in meiner Express-App.

+1

[Funktion.prototype.bind] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind)? – Oka

Antwort

4

Während es existiert, würde ich eher geneigt, es mit einem Verschluss zu tun:

function writeResponse(res) { 

    return function(result) { 
     res.write(JSON.stringify(result)); 
     res.end(); 
    }; 
} 
// and then... 
dbaccess.exec(query, writeResponse(res)); 
+0

Das ist großartig, danke. Ich finde es auch lesbarer als mit Bind. – cocheci

-1

Es existiert, gibt es zwei Methoden. Call und apply die etwas anders sind.

Es gibt auch eine bind Methode, aber es macht eine andere Sache (ändert den Wert this beim Aufruf einer Funktion).

ist es nicht so etwas wie eine ‚Funktionszeiger‘ Ich denke, was Sie brauchen, ist hier currying:

function currier(that, fn) { 
    var args = [].slice.call(arguments, 2); 

    return function() { 
    return fn.apply(that, args); 
    } 
} 
+0

Das scheint OP nicht zu sein. Und Sie können Funktionen in JS übergeben, Funktionen sind Objekte und alle Objekte werden als Referenz übergeben. –

+0

"Übergeben Sie einen Funktionszeiger, der einen Parameter annimmt" klingt für mich wie er eine Funktion von einer Schließung erzeugen möchte –

+0

@LuisSieira Es klingt meistens so, als ob sie die richtige Terminologie nicht verstehen, wenn sie Funktionen in JavaScript beschreiben. – Oka

3

Wenn ich gut verstanden, was Sie versuchen, zu tun, sollte ich auf die Punkt Function.prototype.bind Methode. Es funktioniert wie Sie beschrieben:

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, writeResponse.bind(null, res)); 
}); 
+0

In der Tat, das ist, was ich gesucht habe, obwohl es so aussieht, als sollten Sie "undefined" anstatt "null" passieren? – cocheci

+1

Es ist mehr wie eine Konvention als eine Regel, aber wenn Sie das Null-Objekt übergeben, sagen Sie irgendwie: Dieses Argument sollte "nichts" sein. – Microfed

1

nicht sicher, ob sie in NodeJS noch unterstützt sind, aber wenn So könnten Sie auch Fettpfeilfunktionen einfach genug verwenden.

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, r => writeResponse(res, r)) 
}); 

Sie behalten auch den lexikalischen this Wert, der bei Bedarf schön ist.

Es ist so ähnlich wie folgt aus:

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, function(r) { 
     return writeResponse(res, r); 
    }) 
}); 

obwohl dieser den this von .exec() definiert hat.

+0

In der Tat funktioniert das auch, danke. – cocheci

3

Selbst als etwas anders als die bind Funktion im STL gefunden, obwohl, können Sie <function>.bind verwenden, das ist Teil des Prototyps einer Funktion in JavaScript.

Die bind Methode gibt ein frisch erstellten function Objekt (nicht vergessen, dass function s sind erste Bürger in JavaScript und werden von Start-Function Prototyp aufgebaut), die N minus M Parameter (in JavaScript ein dies akzeptiert schwache Beschränkung in der Tat wird es jemals so viele Parameter akzeptieren, wie Sie es übergeben, aber es gibt keine Garantien, dass sie verwendet werden), wobei N ist die ursprüngliche Anzahl der akzeptierten Parameter, während M sind die gebundenen.

Der wesentliche Unterschied besteht darin, dass bind auch als erstes Argument akzeptiert ein Umfang Objekt, das aus der neu geschaffenen Funktion selbst als this Referenz verfügbar sein wird, so können Sie buchstäblich ändern und injiziert die this Referenz während der Ausführung.

Here Sie können die Dokumentation von bind finden.

Wie jemand erwähnt, können Sie auch auf Schließungen verlassen in Ihr Ziel zu bekommen fast allen Fällen, in denen Sie binden verwenden können.

Verwandte Themen