假设我们有一个功能。
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中使用打字稿进行此操作。所以上面实际上是类中的方法。
答案 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
,那么最后一次回调的结果可能是也可能不是你所期望的。