0

私はjavascriptを初めて使用し、非同期の側面やクロージャーなどに実際には対応できません。これについて数日間調査し、多くの試行錯誤を繰り返しましたが、次の問題を解決できないようです:

ツリー構造をたどって、すべての最下位ノード (子ノードのないノード) を収集しようとしています。このノード データはグローバル配列にロードされます (最適ではありませんが必要です)。私が使用している walk 関数は再帰的です。しかし、非同期の性質により、再帰呼び出しが戻る前に関数への最初の呼び出しが返されるため、ツリー全体が調査されません。ツリー全体をトラバースするように見える匿名関数に入れてみましたが、グローバル配列がロードされていません(アクセスできませんか?)。

ところで、実際のコードは別の分離されたネットワーク上にあるため、ここに直接カット アンド ペーストすることはできません。以下は、関連する部分と機能的に同等です(タイプミスがない限り)。申し訳ありません。どんな助けでも大歓迎です。

var nodeList = new Array(); // global variable

function someFunction(rootNode) {
   // unrelated processing here
   walkTree(rootNode);   // gather the childless nodes
   return;
}

function walkTree(node) {
   return function() {   // required in order traverse the entire tree
                         // but with it, nodeList does not get populated
      var num = node.numChildren();
      var childNodes = node.getChildNodes();
      for (var i=0; i<num; i++)  {
         var currentNode = childNodes.item(i);
         if (currentNode.numChildren() > 0) {
            walkTree(currentNode);
         }
         else {
             var obj = new Object();
             /// extract certain attributes of current node here
             /// and make a variant 
             nodeList[nodeList.length] = obj;
         }
      } // END for
   } // close anonymous function
} // END FUNCTION 
4

1 に答える 1

0

非同期実行が必要ない場合は、コードを単純化できます。

var nodeList = [];

function someFunction(rootNode) {
   // unrelated processing here
   walkTree(rootNode);   // gather the childless nodes
   return;
}

function walkTree(node) {
   var num = node.numChildren(),
       childNodes = node.getChildNodes();
   for (var i=0; i<num; i++)  {
      var currentNode = childNodes.item(i);
      if (currentNode.numChildren() > 0) {
         walkTree(currentNode);
      }
      else {
         var obj = new Object();
         /// extract certain attributes of current node here
         /// and make a variant 
         nodeList.push(obj);
      }
   }
}

非同期実行が必要な場合、実装は使用した非同期メカニズム (Web ワーカー、 setTimeout を使用したシミュレーション、Clumpyなどのフレームワークなど) によって異なります。

たとえば、Clumpy を使用すると、次のようにコーディングできます (未テスト)。

var nodeList = [],
    clumpy = new Clumpy();

function someFunction(rootNode) {
   // unrelated processing here
   walkTree(rootNode);   // gather the childless nodes
   return;
}

function walkTree(node) {
   var num = node.numChildren(),
       childNodes = node.getChildNodes(),
       i;
   clumpy.for_loop(
       function() { i = 0; },
       function() { return i < num; },
       function() { i++; },
       function() {
           var currentNode = childNodes.item(i);
           if (currentNode.numChildren() > 0) {
              walkTree(currentNode);
           }
           else {
              var obj = new Object();
              /// extract certain attributes of current node here
              /// and make a variant 
              nodeList.push(obj);
           }
       }
   );
}
于 2013-07-18T18:22:13.647 に答える