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 回答