0

基本的に、各ノードがその親への参照を持つツリーを設定しようとしています。私は次のことを試しました:

function insert_node(node_data, parent_id) {
  var deferral = Q.defer()
  deferral.promise.then(async_create_node(node_data, parent_id))

  deferral.promise.then(function(parent_node_id) {
    var deferral = Q.defer()
    node_data.children.forEach(function(node) {
      deferral.promise.then(insert_node(generate_node_data(node), parent_node_id))
    }
    return deferral.resolve();
  }

  return deferral.resolve();
}

function insert_all_nodes() {
  var deferral = Q.defer();
  deferral.promise.then(insert_node(top_node));
  deferral.resolve()
}

問題は、一度に 1 つのノードのみを作成し、そのノードの作成が完了するまで待ってから、次のノードに移動する必要があることです。現在の動作方法では、最初のノードが完了する前に新しいノードの作成を開始するため、問題が発生します。いくつかの方法で関数をネストし、Q.fcall() を使用してみました。複数の子ノードに対して返されるID が必要ですasync_create_node。それ以外の場合は、再帰を使用します。

4

1 に答える 1

0

非同期性と再帰の組み合わせにより、これを理解するのが少し難しくなります。

まず、 がasync_create_node()promise を返すことを確認する必要があります。そうしないと、その非同期性を認める根拠がなく、エンタープライズ全体が同期する必要があります。

次に、各レベル (特に最上位レベル) で、そのレベルのノードが作成されたことだけでなく、その下のツリー全体が作成されたことも知る必要があるとします。

次に、次のようなことができるはずです。

function insert_node(node_data, parent_id) {
    var dfrd = Q.defer();
    async_create_node(node_data, parent_id).then(function(id) {
        var promises = [];
        node_data.children.forEach(function(node) {
            promises.push(insert_node(generate_node_data(node), id));
        });
        Q.all(promises).then(dfrd.resolve);
    });
    return dfrd.promise;
}

function insert_all_nodes() {
    return insert_node(top_node_data, top_node_id);
}

それはすべて私の頭のてっぺんから離れたものであり、テストされていません。

編集

兄弟ノードを順番に作成するには、次のようにループ内.then()でチェーンを構築できます。forEach

function insert_node(node_data, parent_id) {
    var dfrd = Q.defer();
    async_create_node(node_data, parent_id).then(function(id) {
        var p = Q.defer().resolve().promise;//Seed promise on which to build a then() chain.
        node_data.children.forEach(function(node) {
            p = p.then(function() {
                insert_node(generate_node_data(node), id);
            });
        });
        p.then(dfrd.resolve);
    });
    return dfrd.promise;
}
于 2013-06-16T07:42:13.350 に答える