2016-10-12 1 views
0

ich Schwierigkeiten Umfang erlebt habe durch die asynchrone Struktur des folgenden Dojo-Widget vorbei:Dojo: Richtige Weg, um ‚Hitch‘ Umfang der latenten Arten

function callDef(){ 
//This function has the scope I need 
     var deferred = new Deferred(); 
//try to hitch 'this' to function2 
    DojoBaseLang.hitch(this,deferred.resolve(function2(1))); 
    deferred.then(DojoBaseLang.hitch(this, function(callback) { 
     callback.then(
      function (desiredResult) { 
       //How to hitch callDef initial scope to function3? 
       function3(desiredResult); 
      }, 
      function (err) { 
       // Do something when the process errors out 
       console.log(err); 
      }) 
      }), 
    function (err) { 
     // Do something when the process errors out 
     console.log(err); 
    } 
); 
function function2(variable){ 
//callDef scope not passed by hitch :(
    var dataStucture; 
    //deferredFunction is a function which returns type Deferred 
    return deferredFunction(hierarchyTableQuery, function(dataSet){ 
     //some iterative maniupulations will be performed on dataStructure here 
     dataStructure = dataSet; 

    }).then(function(){ 
     return dataStructure; 
    }); 
} 

function function3(variable){ 
    //need a way to also have scope in this method 
    //doing other stuff 
} 

Wie Sie sehen können, callDef zuerst in function2 ruft, gibt eine latente , beendet die Ausführung und übergibt dann das Ergebnis aus dem Objekt dataStructure von function2 an function3. Dies alles funktioniert gut in Bezug auf Deferred/Async-Verhalten, das Problem ist, dass die dojo/_base/lang.hitch Funktion, die aufgerufen wird, nicht den Gültigkeitsbereich von Funktion zu Funktion wie es normalerweise passiert, in diesem Fall von callDef zu function2. Ich möchte auch den gleichen Umfang in function3 übergeben. Meine require-Anweisung ist korrekt, und ich habe andere nicht asynchrone Aufrufe von .hitch, die in demselben Widget/derselben Datei erfolgreich sind.

Vielen Dank für jede Hilfe

+1

OMG suchen. Es heißt "Kontext" oder "Empfänger", nicht * Geltungsbereich *, sieht so aus, als müssten die Dojo-Dokumente repariert werden. Und wenn Sie 2016 Code schreiben, sollten Sie [die 'bind' Methode] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) nicht verwenden 'hitch' Funktion. Oder nutzen Sie einfach die Pfeilfunktionen direkt. – Bergi

+0

Danke für die Eingabe. Können Sie erweitern, was Sie mit Pfeilfunktionen implizieren? Es erscheint gemäß [Arrow function guide] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions): * Arrow Funktionsausdruck hat eine kürzere Syntax als Funktionsausdrücke und bindet sein eigenes nicht, arguments, super, oder new.target * – Rice

+0

Ja, genau diese. Vielleicht möchten Sie auch unsere kanonische Frage zum Thema lesen: [Wie kann man auf den richtigen 'this/Kontext innerhalb eines Callbacks zugreifen?] (Http://stackoverflow.com/q/20279484/1048572) – Bergi

Antwort

2

Sie sind wahrscheinlich für

… 
deferred.resolve(DojoBaseLang.hitch(this,function2)); 
deferred.then(DojoBaseLang.hitch(this, function(callback) { 
    callback(1).then(
     DojoBaseLang.hitch(this,function3), 
     function (err) { 
… // rest of the code 
+0

das hat funktioniert , nur wenn ich den '.hitch' Aufruf inline mit dem ersten' .resolve' Aufruf benutzte, beklagte sich der JS Dolmetscher, dass 'callback.then() keine Funktion ist' Ansonsten funktioniert genau wie benötigt – Rice

+0

Beachten Sie, dass ich' geändert habe callback.then' zu 'callback (1) .then'. Ihr ursprünglicher Code macht nicht wirklich viel Sinn (Erstellen von Deferred, die sofort mit einer Funktion erfüllt werden?), Das war meine beste Schätzung. Vielleicht solltest du deinen ganzen Code bei [codereview.SE] präsentieren – Bergi

Verwandte Themen