Path: csiph.com!aioe.org!news.mb-net.net!open-news-network.org!.POSTED.25.234.197.178.dynamic.wless.lssmb00p-cgnat.res.cust.swisscom.ch!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: de.comp.lang.javascript Subject: Re: not a function Date: Wed, 25 Apr 2018 21:04:44 +0200 Organization: PointedEars Software (PES) Lines: 117 Message-ID: <5377515.lOV4Wx5bFT@PointedEars.de> References: Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit Injection-Info: gwaiyur.mb-net.net; posting-host="25.234.197.178.dynamic.wless.lssmb00p-cgnat.res.cust.swisscom.ch:178.197.234.25"; logging-data="2574"; mail-complaints-to="abuse@open-news-network.org" User-Agent: KNode/4.14.2 X-Face: %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&. Ich habe folgenden JS Code aus bootstrap-treeview übernommen: Nein, hast Du _nicht_, sondern Du hast *wieder* ohne Sinn und Verstand Copy & Pray gemacht :-( > var initSelectableTree = $.getJSON(/include/fetch.php', function(data) { ^ > return $('#treeview-selectable').treeview({ > data: data, > multiSelect: multiSelect, > onNodeSelected: function(event, node) { > $('#selectable-output').prepend('

' + node.text + ' was > selected

'); > }, > onNodeUnselected: function (event, node) { > $('#selectable-output').prepend('

' + node.text + ' was > unselected

'); > } > }); > }); > > > wenn ich nun > > var $selectableTree = initSelectableTree(); > > aufrufe, dann erhalte ich den Fehler > > Uncaught TypeError: initSelectableTree is not a function Vorher solltest Du auch schon einen Syntaxfehler erhalten. > Was fehlt denn da noch? Dir ist trotz des vorherigen Threads, den Du vor anderthalb Monaten hier angefangen hattest, offenbar *immer* *noch* *nicht* klar, wie *asynchrone* Verarbeitung funktioniert, und wie sie sich von *synchroner* Verarbeitung unterscheidet. function (data) { … } als zweites Argument von $.getJSON() ist offensichtlich ein *Callback*, der ausgeführt wird, wenn der Server auf den HTTP-Request (URI angegeben durch das erste Argument) *geantwortet* hat. Die Antwort vom Server trifft in der Regel ein, *nachdem* $.getJSON() ausgeführt wurde *und* *zurückgekehrt* ist. Der Rückgabewert des Callbacks landet also _nicht_ in “initSelectableTree”, sondern wird (in der Regel) *weggeworfen*. Und der Rückgabewert von jQuery.getJSON() ist, wie Du hättest nachlesen können, _nicht_ ausführbar (callable), sondern ein Objekt, was das Promise- Interface implementiert (ab jQuery 1.5; vorher wohl der “undefined”-Wert): Ich mal’s Dir nochmal als UML-Sequenzdiagramm auf (Festbreitenschriftart verwenden). Du willst folgendes machen: .---------------- Client --------------. : : Script HTTP API Server : : : .-. $.getJSON() : : : :---------------------->.-. GET /include/fetch.php HTTP/1.x : : : : :---------------------------------->.-. : : undefined/:: Promise : : : : : :<- - - - - - - - - - --'-' : : : : : : : : DOM API function (data) HTTP/1.x 200 OK : : : : : .-.<- - - - - - - - - - - - - - - - --'-' : : .-.<-----------: : : : : : : : : : : : '-'- - - - - ->: : : : : : '-' : '-' : : : : : X : X : : Demgegenüber machen die Bootstrap-Leute im Originalcode etwas *völlig* *anderes*: .---------------- Client --------------. *kein* Server : : : .-. : : (function () { … }()) : :----------------------->.-. : : : : : :<- - - - - - - - - - - -'-' : : : : initSelectableTree() : :----------------------->.-. : : : : : :<- - - - - - - - - - - -'-' : : '-' : X (Schau Dir mal an, wo “defaultData” herkommt.) Jetzt klar? -- PointedEars FAQ: | | Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.