Задать вопрос
@uroot

Почему три варианта одной и той же функции работают по-разном?

Объясните мне почему три варианта одной и той же функции работают по-разному.

// Есть массив объектов:
[{
  name: 'dismissal_reason_id',
  options: lookupDismissalReasonsByGroup()
}]

// Сама функция lookupDismissalReasonsByGroup:
function lookupDismissalReasonsByGroup () {
  const method = dismissalReasons.lookupDismissalReasonsByGroup

  return function(_, props) {
    return function ({ text }) {
      const id = props && props.dismissal_reason_group_id ? props.dismissal_reason_group_id : null
      return method({ id, search: text, limit: 100 })
    }
  }
}

// Далее в Vue 2 в цикле создаются компоненты и вызывается функция options:
const options = this.field.options(this.currentValue, this.value)


Данный код работает. Все отлично. Но до этого я перебирал разные походы, которые не дали желаемый результат. Почему - я до конца не понимаю. Прошу объяснить почему и как можно их исправить.

Второй подход с явной передачей параметров в lookupDismissalReasonsByGroup:

[{
  name: 'dismissal_reason_id',
  options: (_, props) => lookupDismissalReasonsByGroup(props)
}]

function lookupDismissalReasonsByGroup (props) {
  const method = dismissalReasons.lookupDismissalReasonsByGroup

  return function() {
    return function ({ text }) {
      const id = props && props.dismissal_reason_group_id ? props.dismissal_reason_group_id : null
      return method({ id, search: text, limit: 100 })
    }
  }
}

const options = this.field.options(this.currentValue, this.value)


Как результат - запрос даже не ушёл на бэк, просто потерялся в замыкании. Я тут не могу понять почему так. Как это мы просто не дошли к return method({ id, search: text, limit: 100 }), хотя функция просто вызывает другую функцию?

В третьем варианте отличается только функция lookupDismissalReasonsByGroup:

function lookupDismissalReasonsByGroup (props) {
  return dismissalReasons.lookupDismissalReasonsByGroup({ id: props && props.dismissal_reason_group_id ? props.dismissal_reason_group_id : null })
}


Как результат - вернулся промис, но запрос на бэк уже ушёл. Но почему промис не развернулся, ведь тут же return?

Спасибо за объяснение!
  • Вопрос задан
  • 127 просмотров
Подписаться 1 Сложный 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
director-rentv
@director-rentv
Frontend-разработчик
Насколько я вижу, в первом варианте, lookupDismissalReasonsByGroup - это функция (1), которая возвращает функцию (2), которая возвращает функцию (3)

И в массиве объектов поле options - это результат вызова (1), т.е. (2)
Затем в строке
const options = this.field.options(this.currentValue, this.value)
вызывается (2) и в options записывается (3)

В случае же второго варианта lookupDismissalReasonsByGroup получается совершенно такая же по вложенности функций. Но в массиве объектов теперь в поле options - не результат вызова (1), а другая функция (0), которая внутри себя вызывает (1) и возвращает её результат (2)
И получается, что далее в
const options = this.field.options(this.currentValue, this.value)
вызывается (0) и в options записывается (2), т.е. не та же функция, как в первом примере
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы