2017-01-26 4 views
0
//request is a node module 
var request = require('request'); 
/** 
    * send REST web service message to server 
    * @function sendMessage 
    * @param {string} method - GET, POST, PUT, DELETE 
    * @param {string} url - server URL 
    * @param {object} json - The data to be send 
    * @param {object} cb - callback function 
    *@param{object}formData-The data related to file upload 
    * @returns void 
    */ 
    function sendMessage(type,url,method,json,retries,formData,cb){ 
     var options={ 
     url:url, 
     formData:formData, 
     json:true, 
switch (method) { 
    case 'get': 
     request.get(options, cb); 
     break; 
    case 'post': 
     envelope.token = json.token; 
     envelope.package = json.package; 
     options.body = envelope; 
     request.post(options, cb); 
     break; 
    case 'put': 
     envelope.package = json.package; 
     envelope.token = json.token; 
     options.body = envelope; 
     request.put(options, cb); 
     break; 
    case 'delete': 
     request.delete(options, cb); 
     break;  
} 

Hier nachrichts() fuction bereits geschrieben und gut in allen Modulen ohne Formdata-Parameter (sendMessage(type,url,method,json,retries,cb)), aber für Datei-Upload verwendet werden, müssen wir den Dateipfad ohne Verwendung von Formulardaten übergeben Ändern Sie alle anderen Funktionen ist das möglich.Wie mit Rückruf in Javascript optionale Parameter zu handhaben

+1

Mit so vielen Parametern sollten Sie stattdessen ein einzelnes Objekt verwenden. – Lewis

+0

Ja, Sie haben Recht, aber, Es ist bereits so gebaut und überall auf den anderen Modulen verwendet. Veränderung ist jetzt unmöglich. und ich brauche eine Lösung ohne Auswirkungen auf andere Module –

+0

Sie möchten dies lesen [Wie Funktionen in Javascript überladen] (http://stackoverflow.com/questions/10855908/how-to-overload-functions-in-javascript/10855939# 10855939), die auch optionale Argumente umfasst. – jfriend00

Antwort

1

Erstellen Sie eine neue Methode, die ein Objekt als Parameter akzeptiert, das das Objekt analysiert und entscheidet, ob die ursprüngliche Funktion ausgeführt oder Ihre neue Anforderung erfüllt werden soll.

Markieren Sie die ursprüngliche Methode als veraltet und das Dokument als die neue Methode, und wenn die Zeit reif ist, können Aufrufe der ursprünglichen Methode ersetzt werden. Wenn sie alle ersetzt sind, refaktorieren Sie Ihre neue Funktion, um den Proxy zu entfernen, und entfernen Sie, wenn Sie sicher sind, die alte Methode.

Versuchen Sie, so viel Funktionalität wie möglich aus der ursprünglichen Methode zu abstrahieren, um den Code DRY zu behalten.

Schreiben Sie nach Möglichkeit einen Test, den sowohl die ursprünglichen als auch die neuen Methoden bestehen können.

2

Wenn die beiden unterschiedlichen calling Schemata Sie unterstützen möchten sind dies:

sendMessage(type,url,method,json,retries,formData,cb) 

und diese:

sendMessage(type,url,method,json,retries,cb) 

Und wird die Callback-Argument immer erforderlich, dann können Sie das tun, wie Dies ist:

Wie andere gesagt haben, wenn Sie so viele Argumente bekommen, ist es oft besser, ein zu verwenden Einzeloptionsobjekt, an das Sie Eigenschaften anhängen. Dann wird es viel einfacher, einige der Argumente optional zu machen.

Sie können auch feststellen, dies nützlich:

How to overload functions in javascript?


FYI, gibt es auch die Art und Weise Sie so etwas wie dies in einem härteren typisierten Sprache lösen könnten. Sie würden eine zweite Funktion erstellen, die das zusätzliche Argument übernimmt und die Implementierung dorthin verschiebt. Dann wird die ursprüngliche Funktion zu einer Shell, die die neue Funktion mit null für das neue Argument aufruft.

function sendMessage2(type,url,method,json,retries,formDataArg,cbArg) { 
     // full implementation here with all arguments, formDataArg may be null 
} 

// original function here, calling signature unchanged 
function sendMessage(type,url,method,json,retries,cbArg) { 
    // call new implementation with arguments in the right place 
    return sendMessage2(type, url, method, json, retries, null, cbArg); 
} 

Während dies funktioniert und verwenden Überlastung nicht, es ist so eine Art einmalige Schuss, weil Sie nicht wollen, am Ende mit sendMesage3, sendMessage4, etc ... Wahrscheinlich sollte sendMessage2 die Optionen-Objekt verwenden Das ist viel mehr erweiterbar, so dass Sie nicht wieder gezwungen werden. Dann, irgendwann später, wenn Sie mehr Flexibilität haben, können Sie den älteren Code auf das Optionsobjekt umstellen und das ganze API-Schema vollständig loswerden.

, die wie folgt aussehen könnten:

function sendMessageOptions(options, cb) { 
    // main code here that supports formData to send the message 
    // gets arguments from the options object 
} 

// original function here, calling signature unchanged 
function sendMessage(type,url,method,json,retries,cbArg) { 
    // call new implementation with arguments in the right place 
    return sendMessageOptions({type: type, url: url: method: method, json: json: retries: retries}); 
} 

Hinweis, verließ ich den Rückruf aus den Optionen-Objekt, da dies die Funktion kompatibel mit dem typischen macht async Aufrufkonvention und Inline-Rückrufe für den Anrufer sauberen Code macht .

+0

Das könnte funktionieren, hat aber die Möglichkeit, ein Wartungsalbtraum zu werden! – AndFisher

+0

@AndFisher - Es ist kein Wartungs-Albtraum, wenn Sie nicht weitere optionale Argumente hinzufügen. Wie die Antwort bereits sagt, ist dies der richtige Weg, um zu einem Optionsobjekt zu wechseln, aber das OP hat bereits gesagt, dass dies keine Möglichkeit ist, weil sie nicht alle anderen Anrufer zu diesem Zeitpunkt ändern können. Es gibt also keine andere Wahl für diese Einschränkung. Kennen Sie eine andere Möglichkeit, die Frage angesichts der vorgeschlagenen Einschränkungen zu beantworten? – jfriend00

+0

Es wird gegen das Konzept der Doc-Kommentare gehen, die einen neuen Entwickler verwirren könnten, der zwar erben kann, aber nicht mit dem Projekt vertraut ist, daher Wartungsproblem. – AndFisher