Javascript:函数会调用所有调用它的函数的所有回调函数吗?

时间:2018-04-26 06:43:49

标签: javascript callback

假设我们有一个功能。

function kevin(cb){
   //Ok  then, so async stuff here, then, when done, 
   cb(1); <== reply;
}

然后:

....
kevin(x=> console.log(x));

然后,在上述呼叫收到回复之前,另一个阻止呼叫kevin()

kevin(y=> console.log(y));

我在使用Java一段时间之后感到困惑,如果这些回调是Java接口,则在java中使用上述内容,并且在第一次调用返回之前发生第二次kevin调用,第二个调用将覆盖第一个调用,只返回第二个调用,要求composite pattern确保在方法完成时记录并完成所有回调。

但是在Javascript中,我没有收到任何错误,一切正常,所有调用kevin()的函数回调都被调用。

我在Angular中使用打字稿进行此操作。所以上面实际上是类中的方法。

1 个答案:

答案 0 :(得分:3)

后续函数调用以任何方式替换以前的函数调用。如果在函数内部等待某个异步事件,则在每个await的事件循环上安排新的回调。简单的例子:

setTimeout(() => console.log(1));
setTimeout(() => console.log(2));
setTimeout(() => console.log(3));

所有三个回调都会触发各自的值。

唯一一次受到干扰的是你有共享变量:

let foo = 'bar';

setTimeout(() => console.log(foo));
setTimeout(() => foo = 'baz', 500);
setTimeout(() => console.log(foo), 1000);

如果你不知道在另一个回调中操纵了共享foo,那么最后一次回调的结果可能是也可能不是你所期望的。