Javascript: Будет ли функция вызывать все обратные вызовы для всех функций, которые когда-либо вызывали ее? - PullRequest
0 голосов
/ 26 апреля 2018

Скажем, у нас есть функция.

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 голосов
/ 26 апреля 2018

Последующие вызовы функций не каким-либо образом заменят предыдущие вызовы функций. Если внутри функции ожидается какое-то асинхронное событие, тогда для каждого события запланирован новый обратный вызов в цикле событий. Простой пример:

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 манипулирует в другом обратном вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...