Передать дополнительную переменную в функцию обратного вызова

Я пытаюсь создать простой метод, который выводит результаты моей операции с БД в предварительном формате в консоли. Я хочу передать дополнительную переменную (operationName) моей пользовательской функции обратного вызова регистратора, когда моя БД завершает операцию.

// Custom logger (simplified)
const dbLogger = (error, data, operationName) => {
  if (error) {
    console.log(`${operationName} failed`, error)
  }
  console.log(`${operationName} success`, data)
}

// mongodb operations
import ChatModel from 'somewhere';

function createMessage() {
  const newChatAdded = new ChatModel({
    message: 'Hi'
  })
  ChatModel.save(newChatAdded, dbLogger);
}

Здесь ошибка и данные в нашем обратном вызове предоставляются методом ChatModel.save, но я также хочу отправить третий параметр имя_операции (например, «сохранить» или «удалить»).

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Два пути, выбирай!

  1. используйте анонимную функцию с остаточный параметр и распространение при вызове dbLogger:

    ChatModel.save(newChatAdded, (...args) => dbLogger(...args, "save");
    
  2. используйте связанная функция:

    Измените сигнатуру функции dbLogger, чтобы она принимала operationName в качестве первого аргумента:

    const dbLogger = (operationName, error, data) => {
      if (error) {
        console.log(`${operationName} failed`, error)
      }
      console.log(`${operationName} success`, data)
    }
    

    Создайте новую связанную функцию журнала, которая всегда будет вызываться с «сохранить» в качестве первого аргумента.

    ChatModel.save(newChatAdded, dbLogger.bind(null, "save");
    

    Это также называется "частичное применение".

Спасибо за отличный ответ. Просто вопрос. Итак, в этом случае dbLogger.bind создает новую функцию со строкой «сохранить» в качестве первого параметра, верно? Как во время этого процесса передаются аргументы «данные» и «ошибка»?

Bijay Timilsina 22.05.2019 12:23

Это эквивалентно - вы просто сначала назначаете ссылку на связанную функцию переменной. Вы можете прочитать о Function.prototype.bind в ссылке на MDN в моем ответе, это должно прояснить, что происходит; по сути, мы создаем функцию новый с "фиксированным" первым аргументом, но где этот первый аргумент не ожидается при вызовах функции. Итак, что касается вызывающей стороны, функция имеет сигнатуру (error, data).

sdgluck 22.05.2019 12:32

Ах, я вижу, что он возвращает копию данной функции с указанным this и набором начальных аргументов. Понятно! Спасибо еще раз :)

Bijay Timilsina 22.05.2019 12:35
ChatModel.save(newChatAdded, (error, data) => dbLogger(error, data, 'save'));

Если бы вы изменили порядок своих параметров, вы могли бы сделать это более кратким:

const dbLogger = (operationName, error, data) => ...

ChatModel.save(newChatAdded, dbLogger.bind(null, 'save'));

Другие вопросы по теме