将额外变量传递给回调函数

Posted

技术标签:

【中文标题】将额外变量传递给回调函数【英文标题】: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 (例如“保存”或“删除”)。

【问题讨论】:

【参考方案1】:

两种方式,任君挑选!

    在调用dbLogger 时使用带有rest parameter 和spread 的匿名函数:

    ChatModel.save(newChatAdded, (...args) => dbLogger(...args, "save");
    

    使用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'));

【讨论】:

以上是关于将额外变量传递给回调函数的主要内容,如果未能解决你的问题,请参考以下文章

将范围传递给回调函数/绑定

避免 nodeJs 中的回调地狱/将变量传递给内部函数

ctypes给扩展模块中的函数传递回调函数

将额外参数传递给 usort 回调

将回调函数作为道具传递给孩子

将 Go 函数作为回调传递给 C