2012-04-17 2 views
0

основной JS вопрос, пожалуйста, идти просто на меня я Newb :)возврат из функции JS

прохожу 2 переменные в функции findRelatedRecords которая запрашивает другие связанные таблицы и собирает массив объектов, называются данными. Поскольку findRelatedRecords имеет так много внутренних функций, мне трудно получить массив данных из функции.

Как это в настоящее время, я называю showWin внутри findRelatedRecords, но я хотел бы изменить его так, что я могу получить массив данных непосредственно из findRelatedRecords, а не прыгать в showWin

function findRelatedRecords(features,evtObj){ 
    //first relationship query to find related branches 

    var selFeat = features 
    var featObjId = selFeat[0].attributes.OBJECTID_1   
    var relatedBranch = new esri.tasks.RelationshipQuery(); 
    relatedBranch.outFields = ["*"]; 
    relatedBranch.relationshipId = 1; //fac -to- Branch 
    relatedBranch.objectIds = [featObjId]; 
     facSel.queryRelatedFeatures(relatedBranch, function(relatedBranches) { 
     var branchFound = false; 
     if(relatedBranches.hasOwnProperty(featObjId) == true){ 
      branchFound = true; 
      var branchSet = relatedBranches[featObjId] 
      var cmdBranch = dojo.map(branchSet.features, function(feature){ 
       return feature.attributes; 
      }) 
     } 

     //regardless of whether a branch is found or not, we have to run the cmdMain relationship query 
     //the parent is still fac, no advantage of the parent being branch since cmcMain query has to be run regardless 
     //fac - branch - cmdMain - cmdSub <--sometimes 
     //fac - cmdMain - cmdSub <-- sometimes 

     //second relationship query to find related cmdMains    
     var relatedQuery = new esri.tasks.RelationshipQuery(); 
     relatedQuery.outFields = ["*"]; 
     relatedQuery.relationshipId = 0; //fac -to- cmdMain 
     relatedQuery.objectIds = [featObjId]; 
     //rather then listen for "OnSelectionComplete" we are using the queryRelatedFeatures callback function 
     facSel.queryRelatedFeatures(relatedQuery, function(relatedRecords) { 
      var data = []   
      //if any cmdMain records were found, relatedRecords object will have a property = to the OBJECTID of the clicked feature 
      //i.e. if cmdMain records are found, true will be returned; and continue with finding cmdSub records 
      if(relatedRecords.hasOwnProperty(featObjId) == true){ 
       var fset = relatedRecords[featObjId] 
       var cmdMain = dojo.map(fset.features, function(feature) { 
        return feature.attributes; 
       }) 
       //we need to fill an array with the objectids of the returned cmdMain records 
       //the length of this list == total number of mainCmd records returned for the clicked facility 
       objs = [] 
       for (var k in cmdMain){ 
        var o = cmdMain[k]; 
        objs.push(o.OBJECTID)      
       } 

       //third relationship query to find records related to cmdMain (cmdSub) 
       var subQuery = new esri.tasks.RelationshipQuery(); 
       subQuery.outFields = ["*"]; 
       subQuery.relationshipId = 2; 
       subQuery.objectIds = [objs] 
       subTbl.queryRelatedFeatures(subQuery, function (subRecords){ 

        //subRecords is an object where each property is the objectid of a cmdMain record 
        //if a cmdRecord objectid is present in subRecords property, cmdMain has sub records 
        //we no longer need these objectids, so we'll remove them and put the array into cmdsub 
        var cmdSub = [] 
        for (id in subRecords){ 
         dojo.forEach(subRecords[id].features, function(rec){ 
          cmdSub.push(rec.attributes) 
         }) 
        } 
        var j = cmdSub.length; 
        var p; 
        var sub_key; 
        var obj; 
        if (branchFound == true){ 
         var p1 = "branch"; 
         obj1 = {}; 
         obj1[p1] = [cmdBranch[0].Branches] 
         data.push(obj1) 
        }       
        for (var i=0, iLen = cmdMain.length; i<iLen; i++) { 
         p = cmdMain[i].ASGMT_Name 
         obj = {}; 
         obj[p] = []; 
         sub_key = cmdMain[i].sub_key; 
         for (var j=0, jLen=cmdSub.length; j<jLen; j++) { 
          if (cmdSub[j].sub_key == sub_key) { 
           obj[p].push(cmdSub[j].Long_Name); 
          } 
         } 
         data.push(obj); 
        } 
        showWin(data,evtObj) <---this would go away 
       }) 
      } 
      //no returned cmdRecords; cmdData not available 
      else{ 
       p = "No Data Available" 
       obj = {} 
       obj[p] = [] 
       data.push(obj) 
      } 
      showWin(data,evtObj) <--this would go away 
     }) 
    }) 
} 

Я бы например, иметь доступ к массиву данных, просто позвонив по телефону

function findRelatedRecords(feature,evt){ 
    //code pasted above 
} 

function newfunct(){ 
    var newData = findRelatedRecords(feature,evt) 
    console.log(newData) 
} 

Возможно ли это?

спасибо!

Редактировать

Немного больше объяснений .....

Я подключения прослушивателя событий к функции следующим образом:

function b (input){ 
    dojo.connect(obj, "onQueryRelatedFeaturesComplete", getData); 
    obj.queryRelatedFeatures(input); 
    console.log(arr) //<----this doesn't work 
} 

function getData(relatedFeatData){ 
    var arr = []; 
    //populate arr 
    return arr; 
} 

Так что, когда obj.QueryRelatedFeatures () завершено, getData срабатывает; эта часть работает нормально, но как я могу получить доступ к функции b?

+0

Я что-то упустил или вам просто нужно добавить 'возвращаемые данные ', где будет showWin? –

ответ

1

сообщение Редактировать Обновление:

Благодаря таким образом, что это мероприятие зацепили вы не можете просто возвращает данные из него. Возвращение просто позволит Dojo вызвать следующий метод, который подключен к onSelectionComplete.

Когда init работает это задолго до того, findRelatedRecords никогда не будет выполнен/уволен onSelectionComplete случае хорошо, поэтому вы видите undefined/null значения. Единственный способ работать с подобной системой - либо: 1) отменить метод, как вы уже делали, или 2) отключить настраиваемое событие/сообщение (технически он все равно просто вызывает метод).

Если вы хотите, чтобы этот метод работал с вами, вам необходимо реорганизовать/извлечь фрагменты из него, чтобы сделать его меньшей функцией, но содержащейся во многих функциях. Кроме того, изменение его, чтобы иметь только одну точку выхода в конце метода findRelatedRecords, поможет. Функция, определенная внутри subTbl.queryRelatedFeatures(), будет отличным местом для начала.

Извините, вы ограничены тем, что Dojo дает вам в этом случае.

Pre Edit Ответ:

Просто вернуть данные из него. Везде, где есть вызов showWin, просто используйте это возвращение.

return { 
    data: data, 
    evtObj: evtObj 
    } 

Тогда ваш новый фонд будет выглядеть следующим образом.

function newfunct(){ 
    var newData = findRelatedRecords(feature,evt); 
    console.log(newData); 
    console.log(newData.data); 
    console.log(newData.evtObj); 
} 

Если вам нужно только то, что «данные» объект, а затем изменить ваше возвращение только return data;.

Также начинайте использовать точки с запятой для завершения операторов.

+0

console.log (newData) <- undefined; console.log (newData.data) <- TypeError: newData undefined – dan

+0

Вы возвращаете объект повсюду? В B() выше, как определены? Не могли бы вы собрать jsfiddle? – scottheckel

+0

http://jsfiddle.net/uRCN6/ к середине есть раздел под названием ***** impt раздел, который объясняет мою проблему. Спасибо! – dan

Смежные вопросы