Смущает реактивная реализация vue3

В реактивной реализации vue3 есть это эффектStack. Я не понимаю, почему это должен быть стек, если эффект будет pop () сразу после push ()? Возможно ли, чтобы длина effectStack была больше 1?

try {
  enableTracking()
  effectStack.push(effect)
  activeEffect = effect
  return fn()
} finally {
  effectStack.pop()
  resetTracking()
  activeEffect = effectStack[effectStack.length - 1]
}

person EggTronic    schedule 27.09.2020    source источник


Ответы (1)


Я считаю, что это связано с тем, что эффекты могут вызывать другие эффекты.

Например, свойство computed может вызывать другое свойство computed, и в этом случае оба эффекта будут выполняться одновременно. В этом сценарии «внутренний» эффект запускается до того, как завершится «внешний» эффект, и зависимости должны быть зарегистрированы против правильного эффекта. «Внешний» эффект временно откладывается, пока «внутренний» эффект работает, а затем восстанавливается, когда он завершается.

Таким образом, длина может быть больше 1, если вызов fn вызывает рекурсию обратно в тот же фрагмент кода.

person skirtle    schedule 27.09.2020
comment
Ах да, может быть вложенный эффект. - person EggTronic; 27.09.2020