【问题标题】:Pass extra variable to callback function将额外变量传递给回调函数
【发布时间】:2019-10-08 19:01:37
【问题描述】:

我正在尝试创建一个简单的方法,以在控制台中以美化格式注销我的数据库操作。当我的数据库完成操作时,我想将一个额外的变量 (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);
}

这里我们回调中的 errordataChatModel.save 方法提供,但我想发送第三个参数 operationName (例如“保存”或“删除”)。

【问题讨论】:

    标签: javascript mongodb mongoose error-handling callback


    【解决方案1】:

    两种方式,任君挑选!

    1. 在调用dbLogger 时使用带有rest parameterspread 的匿名函数:

      ChatModel.save(newChatAdded, (...args) => dbLogger(...args, "save");
      
    2. 使用bound function:

      更改您的 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");
      

      这也称为"partial application"

    【讨论】:

    • 感谢您的精彩回答。就一个问题。所以在这种情况下,dbLogger.bind 创建了一个新函数,字符串“save”作为第一个参数,对吧?在这个过程中“数据”和“错误”参数是如何传递的?
    • 这是等价的——你只是首先将绑定函数的引用分配给一个变量。您可以在我的回答中指向 MDN 的链接中阅读有关 Function.prototype.bind 的信息,这样可以更清楚地了解正在发生的事情;本质上,我们正在创建一个带有“固定”第一个参数的 new 函数,但是在调用该函数时不需要第一个参数。因此,就调用者而言,该函数具有签名(error, data)
    • 啊,我看到它返回给定函数的副本,其中包含指定的 this 和初始参数集。知道了!再次感谢:)
    【解决方案2】:
    ChatModel.save(newChatAdded, (error, data) => dbLogger(error, data, 'save'));
    

    如果您要更改参数的顺序,则可以使其更简洁:

    const dbLogger = (operationName, error, data) => ...
    
    ChatModel.save(newChatAdded, dbLogger.bind(null, 'save'));
    

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      相关资源
      最近更新 更多