Передать дополнительную переменную в функцию обратного вызова - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь создать простой метод, который регистрирует результаты моей работы с БД в улучшенном формате в консоли. Я хочу передать дополнительную переменную (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);
}

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

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Два способа, сделай свой выбор!

  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)
    }
    

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

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

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

1 голос
/ 22 мая 2019
ChatModel.save(newChatAdded, (error, data) => dbLogger(error, data, 'save'));

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

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

ChatModel.save(newChatAdded, dbLogger.bind(null, 'save'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...