2016-07-22 2 views
2

Ich oft ein Rohr von kleinen Funktionen erstellen. An einem Punkt in der Pipe, sagen wir auf der dritten Ebene, muss möglicherweise an eine Funktion ein Argument übergeben werden, das die vorherigen Funktionen nicht benötigten.mit Bind dies zu übergeben Argument nach unten die Leitung

Ich könnte eine multi Rückkehr von der ersten Funktion in der Leitung mit dem Zurückgeben eines Gegenstandes mit dem noch nicht benötigten Argument simulieren, aber ich bin nicht sicher, dass es eine gute Praxis ist. So verwende ich binden und diese das Argument speziell zu passieren, wo ich es brauche:

function errorMessageBag(fields, model) { 
    const execution = R.pipe(normalizedFormFields, 
           mergedModelAndFormFields.bind(this, model), // Here I pass an argument only needed by this function 
           fieldsWithValidation, 
           requiredFields, 
           stringLengthValidation, 
           emailValidation, 
           urlValidation) 

    return execution(fields) // Parameter respects signature of first function in the flow. 
} 

Sie sehen in diesem Beispiel ich mergedModelAndFormFields geben ein Argument, Modell. Funktioniert gut, aber ist das eine gängige Praxis oder schlechte Praxis? Wenn schlecht, was ist der richtige Weg, damit umzugehen?

+1

Ihr Ansatz scheint mir vernünftig. – davidchambers

+1

Wenn Sie während des Anrufs keinen Zugriff auf "this" benötigen, ist die Aktualisierung der Funktion möglicherweise eine sauberere Alternative. Aber wenn Sie das tun, scheint das in Ordnung zu sein. –

+0

Danke Jungs, kopieren Sie diese als Antwort und ich werde es wählen. –

Antwort

0

Ich sehe nichts falsch mit dem Ansatz.

Man konnte immer eine innere Funktion definieren und verwenden, die in der Leitung:

function errorMessageBag(fields, model) { 
    const execution = R.pipe(normalizedFormFields, 
          mergedModelAndFormFieldsWrapped, 
          fieldsWithValidation, 
          requiredFields, 
          stringLengthValidation, 
          emailValidation, 
          urlValidation); 

    return execution(fields) 

    function mergedModelAndFormFieldsWrapped(fields) { 
     // model is accessible here 
    } 
} 
0

Wie Scott in seinem Kommentar erwähnt, würde ich nur mergedModelAndFormFields Curry, vorzugsweise vor in dem Rohr verwendet wird. Wenn dies der einzige Ort ist, an dem Sie diese Funktion curren müssen, können Sie dies wie folgt tun:

function errorMessageBag(fields, model) { 
    const execution = R.pipe(normalizedFormFields, 
           R.curry(mergedModelAndFormFields)(model), 
           fieldsWithValidation, 
           requiredFields, 
           stringLengthValidation, 
           emailValidation, 
           urlValidation) 

    return execution(fields) // Parameter respects signature of first function in the flow. 
} 
Verwandte Themen