从回调填充本地数组:同步问题?

时间:2013-09-13 02:04:52

标签: javascript multithreading callback jquery-callback

这是交易:

我在回调中填充本地数组,如下所示:

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的唯一方法来自该回调,那么是否有更好的范例可以解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分: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,它允许您发出事件并异步处理它们。我写了一篇关于它的用法here的文章。

修改:示例:

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);