2016-02-03 82 views
0

鉴于我有一个递归方法:等到函数完成递归函数

tests = { 
    add: function (data, option, dataSet) { 
    if(option) { 
     dataSet.forEach(function (values) { 
     this.add(values.data, false); 
     }, this); 
    } 
    console.log(data.name) 
    } 
} 

而且我会用

tests.add({name: 'test1'}, true, [{data: {name: 'test2'}}]); 

调用这个我认为这将“测试1”之前登录“测试2”在所有情况下,但在很多情况下,这不会发生。据我所知,forEach函数应该阻止其他行的执行,但这不会发生。

上下文位: 代码应该在网页上添加某些组件。这些组件可以依赖于其他组件(在dataSet中)。这些依赖性应该总是先递归添加。

任何想法?

+0

虽然console.log可能是异步的。 – Oriol

+0

你好,你有没有试过用data.name作为参数的回调函数,并在那里执行console.log?还是仅仅为了简单? – Dominik

+0

控制台日志只是为了简单。该功能的其余部分只是将新组件添加到网页中。这些应该按照正确的顺序添加(首先依赖关系)。 –

回答

0

这种不一致的原因是console.log不是同步功能。 Read more here

+0

我从来没有见过一个'console.log'实现,它显示乱序记录的值。这不是你所链接问题的答案。 – Bergi

+0

@Bergi,你可以检查我提供的链接中的最后一个答案,并了解有时'console.log'以实际“打印”的时间显示对象的方式,而不是它看起来的样子你实际上称为'console.log' ... @Sebass在这里说的结果是不一致的,'console.log'的异步性质是恕我直言的一个很好的探索方向。 –

+0

那么确定这就是对象可能发生的情况,但是OP给出的示例片段a)记录字符串值b)永远不会修改任何对象属性 – Bergi