2016-06-03 13 views
0

Ich habe diese Schließung:Klon JavaScript-Funktion, Verschluss Umfang

function CFetchNextData(ofs, pag, fetchFunction) { 
    var offset = ofs; 
    var limit = pag; 

    return function(options, cb) { 
    //do stuff to create params 
    fetchFunction(params, cb); 
    offset += limit; 
    }; 
} 

ich eine Variable auf diese Weise erstellen Sie dann:

var fetchInfo = CFetchNextData(0, 10, specificFetchFunction); 
fetchInfo(options, myCB); 

Damit jedes Mal wenn ich fetchInfo aufrufen, wird Paginierung automatisch auf die nächste Datenmenge. Das funktioniert gut, obwohl Ich möchte mehrere Instanzen haben: "FetchInfo", jeder hat seinen eigenen Umfang.

var A = fetchInfo; // I'd like a clone with its own scope, not a copy 
var B = fetchInfo; // I'd like a clone with its own scope, not a copy 

ich tun konnte:

var A = new CFetchNextData(ofs, pag, fetchFunction); 
var B = new CFetchNextData(ofs, pag, fetchFunction); 

Aber natürlich möchte ich Setup „ofs“ und „pag“ jedes Mal, während durch fetchInfo Klonen, würde ich eine stabile Paginierung haben, setzen Sie nur einmal und für immer. Wissen Sie, wie Sie das erreichen können? Vielen Dank im Voraus

Antwort

2

Es gibt kein Konzept zum Klonen einer Funktion in JavaScript. Sie müssen CFetchNextData (oder eine andere Funktion) mehrmals aufrufen, wenn Sie mehrere Schließungen erstellen möchten.

Sie könnten CFetchNextData eine Fabrikfunktion zurückgeben, anstatt die tatsächliche Funktion zurückzugeben. Aber ich bin mir nicht sicher, ob das wirklich eine Verbesserung ist.

function CFetchNextDataFactory(ofs, pag, fetchFunction) { 
    return function() { 
     var offset = ofs; 
     var limit = pag; 

     return function(options, cb) { 
     //do stuff to create params 
     fetchFunction(params, cb); 
     offset += limit; 
     }; 
    }; 
} 

var fetchInfoFactory = CFetchNextData(0, 10, specificFetchFunction); 
var A = fetchInfoFactory(); 
var B = fetchInfoFactory(); 
+0

Dank hilft. Das Fabrikdesign erreicht genau das, was ich will. Warum würdest du sagen, dass es keine Verbesserung ist? – valvince

0

Dies kann nicht alle Ihre Frage beantworten, sondern nur in aufschlagen, können Sie versuchen, Ihre Parameter auf einen Standard/Fehlerwert zuweisen, die Ihnen erlaubt, zu vermeiden ofs Einstellung und jede Erklärung pag. Unten ist ein Prototyp von dem, was ich gefunden habe. Seine Verwendung oop:

class CFetchNextData { 
    constructor(ofs, pag){ 
    this.OFS = 1; //default value 
     this.PAG = 10; //default value 
    this.ofs = ofs; 
    this.pag = pag; 

     if(ofs == null || ofs == undefined){ 

      this.ofs = this.OFS; 

     } 

    if(pag = null || pag == undefined){ 

      this.pag = this.PAG; 

     } 

    } 
    fetchInfo(){  
     var data = this.ofs += this.pag; 
     return data; 
    } 

} 


var task1 = new CFetchNextData(); // Falls back to default values.. 
var task2 = new CFetchNextData(32,31); // Uses values from specified in args... 

document.write(task1.fetchInfo() + "\n") 
document.write(task2.fetchInfo()) 

Hope this ...

+0

Danke. Das könnte auch eine Lösung sein. Ich könnte dies verwenden, indem ich meine specificFetchFunction an jeden Aufruf fetchInfo übergebe, oder habe this.fetchFunction = specificFetchFunction im Konstruktor und rufe if durch fetchInfo auf. Nebenbei bemerkt, können Sie mit der es6-Klasse Standardwerte in der Konstruktorargumentliste festlegen: constructor (ofs = 1, pag = 10) {...}. – valvince