1

契約は次のとおりです。

次のように、コールバックにローカル配列を設定します。

var datasource = datasources[id];
var contexts = [];

datasource.data($selected.parent().data(), function (items) {
          var dataarr = items.data;
          for (var i = 0; i < dataarr.length; ++i) {
               contexts.push(dataarr[i]);
          }
      });

foo(contexts);

さて、foo で、次のような簡単なチェックを実行します。

function foo(contexts) {
    if (contexts.length < 2) {
        return;
    }
}

上記の return ステートメントで中断すると、contexts.length は実際には 2 より大きくなります。同様に、デバッガーでコードを段階的に実行すると、すべてが期待どおりに機能します。

これにより、デバッガーで実行していない場合、コールバックが完了する前にこのコードが実行されていると思われます。

罰金。しかし、どうすれば実行順序を制御できますか? items.dataまたは、おそらく、取得できる唯一の方法がそのコールバック内からである場合、これを行うためのより良いパラダイムがありますか?

ありがとう!

4

1 に答える 1

2

ここでのコンテキストについては少しわかりませんがfoo、配列が作成された後にメソッドを呼び出したい場合は、for ループの後に呼び出してみませんか? そのようです:

datasource.data($selected.parent().data(), function (items) {
      var dataarr = items.data;
      for (var i = 0; i < dataarr.length; ++i) {
           contexts.push(dataarr[i]);
      }
      foo(contexts);
  });

それが気に入らない場合は、イベントを発行して非同期に処理できるPubSubJSを見てください。使い方はこちらに記事を書きました。

編集:例:

datasource.data($selected.parent().data(), function (items) {
      var dataarr = items.data;
      for (var i = 0; i < dataarr.length; ++i) {
           contexts.push(dataarr[i]);
      }
      PubSub.publish('contextsPopulated', contexts);
  });

次に、次のように変更fooします。

function foo(message, contexts) {
    if (contexts.length < 2) {
        return;
    }
}

foo'contextsPopulated'が通知されるたびに呼び出されるように登録します。

PubSub.subscribe('contextsPopulated', foo);
于 2013-09-13T05:55:19.710 に答える