2016-11-15 4 views
0

In Javascript auf einen Rückruf passieren Ich habe die folgende Funktion aus einer externen Bibliothek:Wie Parameter ohne Zugriff auf die Mutter-Funktion in Javascript

getParentTabId(callback); 

In anderen Teilen des Codes es wie folgt verwendet:

var openTab = function(result){ 
    var parentId = result.Id; 
    //opentNewTab is another external function 
    openNewTab(parentId, 'https://www.google.com'); 
} 

function handleOnClick(){ 
    getParentTabId(openTab); 
} 

und das funktioniert. Mein Ziel ist es, passo eine Variable als zweiter Parameter an openNewTab stattdessen einen festen Wert der Verwendung wie ‚https://www.google.com‘ wie folgt:

var openTab = function(result, url){ 
    var parentId = result.Id; 
    //opentNewTab is another external function 
    openNewTab(parentId, url); 
} 

Ich habe versucht, die folgenden:

function handleOnClick(){ 
    var url = 'http://stackoverflow.com'; 
    getParentTabId(function(result){ 
    openTab(url, result); 
    }); 
} 

Aber es funktioniert nicht arbeiten, weil der Callback die Variable url nicht sehen kann. Wenn Sie berücksichtigen, dass ich die Funktion getParentTabId nicht ändern kann, wie würden Sie dieses Problem angehen?

+2

'Aber es funktioniert nicht, da der Rückruf nicht in der Lage ist, die URL variable' zu ​​sehen - es ist nicht wahr. Callback kann die URL-Variable wegen Javascript-Schließung sehen. – Andrey

+1

Könnte es sein, dass Sie die Parameter 'url' und' result' umschalten? openTab erwartet ein 'result, url', aber Sie haben 'url, result' in den Callback geschrieben. – Phortuin

Antwort

1

Sie könnten versuchen, eine Funktion getOpenTab erklärt, die eine openTab Funktion mit einer dynamischen URL zurück:

function getOpenTab(url) { 
    return function(result) { 
    var parentId = result.Id; 
    //opentNewTab is another external function 
    openNewTab(parentId, url); 
    } 
} 

function handleOnClick() { 
    getParentTabId(getOpenTab('www.foo.com')); 
} 

Erläuterung: Sie haben angegeben, richtig, dass der Rückruf der URL-Parameter nicht „sehen“, weil bei der Umsetzung der getParentTabId der Rückruf wird als callback(result) aufgerufen. Deshalb muss Ihre Callback-Funktion dynamisch erstellt werden.

Nun, wie erstellt man eine Funktion mit dynamischem Inhalt? Einfach, machen Sie einfach eine andere Funktion, die Ihre Callback-Funktion mit den benötigten dynamischen Parametern zurückgibt.

Mit einer anonymen Funktion der ganzen Dinge werden:

function handleOnClick() { 
    var url = 'www.foo.com'; 
    getParentTabId(function(result) { 
    var parentId = result.Id; 
    openNewTab(parentId, url); 
    }); 
} 
+0

Danke für Ihre Antwort. Kurz gesagt, was ist der Unterschied zu meinem Ansatz? – CiccioMiami

+0

Ich denke, dass ich zuerst falsch gelesen habe, was Sie bereits versucht haben - es scheint, dass der einzige Unterschied jetzt die korrekte Implementierung des Callbacks ist (das Ermitteln der 'parentId', Aufrufen von' openNewTab (parentId, url) ') mit der richtigen Argumentreihenfolge. –

Verwandte Themen