这是交易:
我在回调中填充本地数组,如下所示:
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
的唯一方法来自该回调,那么是否有更好的范例可以解决这个问题?
谢谢!
答案 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);