假设我们有一个函数。
function kevin(cb){
//Ok then, so async stuff here, then, when done,
cb(1); <== reply;
}
然后:
....
kevin(x=> console.log(x));
然后另一个 block 在上述调用收到回复之前调用 kevin()
。
kevin(y=> console.log(y));
在使用 Java 一段时间后,我有点困惑,在 java 中,如果这些回调是 Java 接口(interface),并且对 kevin
的第二次调用发生在第一次调用之前返回时,第二个调用将覆盖第一个,并且只返回第二个,需要 复合模式
确保在方法完成时记录并实现所有回调。
但在 Javascript 中,我没有收到任何错误,一切正常,所有调用 kevin()
的函数回调都被调用。
我在 Angular 中使用 typescript 来做这件事。所以以上其实都是类中的方法。
最佳答案
后续的函数调用将不会以任何方式替换之前的函数调用。如果在函数内等待某个异步事件,则会在事件循环上为每个等待安排一个新的回调。简单的例子:
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
正在另一个回调中被操纵,那么最后一个回调的结果可能是也可能不是您所期望的。
关于Javascript : Will a function call all callbacks for all functions that ever called it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50036441/