将额外变量传递给回调函数
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);
这里我们回调中的 error 和 data 由 ChatModel.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'));
【讨论】:
以上是关于将额外变量传递给回调函数的主要内容,如果未能解决你的问题,请参考以下文章