如何向不可修改的预定义函数传递带自定义参数的回调函数以接收结果
解决getEmail回调与自定义回调的参数传递问题
嘿,这个问题其实很典型,核心就是用闭包来帮我们把自定义回调函数传递到receive方法里,同时还能拿到getEmail返回的结果。我给你两种可行的解决方案,你可以根据习惯选一种:
方案一:匿名函数中转参数
这种写法最直观,在send方法里用一个匿名函数作为getEmail的回调,把result和自定义回调一起传给receive:
// 不可修改的预定义函数 -> function getEmail(uID, fn) { var result = { status: 'OK', data: { email: 'john@doe.com'} }; // uID=13对应的返回结果 fn(result); } // <- 不可修改的预定义函数 var helper = { send: (uID, cb_function) => { // 用匿名函数包裹,同时传递result和自定义回调 getEmail(uID, (result) => { helper.receive(result, cb_function); }); }, receive: (result, cb_function) => { if ( result.status == 'OK' ) { cb_function(result.data); } else { alert('GetEmail result wasn\'t OK!'); } }, } helper.send(13, (a) => { // cb_function: alert( 'User email: ' + a.email ); });
为什么这样可行?
匿名函数定义在send方法的作用域里,它能直接访问到cb_function这个参数。当getEmail执行完调用这个匿名函数时,我们就可以把getEmail返回的result和保存的cb_function一起传给receive,完美解决参数传递的问题。
方案二:让receive返回闭包函数
这种写法更简洁,把参数传递逻辑封装在receive内部,让它返回一个能接收result的闭包函数:
// 不可修改的预定义函数 -> function getEmail(uID, fn) { var result = { status: 'OK', data: { email: 'john@doe.com'} }; // uID=13对应的返回结果 fn(result); } // <- 不可修改的预定义函数 var helper = { send: (uID, cb_function) => { // 直接传递receive返回的闭包函数 getEmail(uID, helper.receive(cb_function)); }, receive: (cb_function) => { // 返回一个接收result的函数,闭包保存cb_function return (result) => { if ( result.status == 'OK' ) { cb_function(result.data); } else { alert('GetEmail result wasn\'t OK!'); } }; }, } helper.send(13, (a) => { // cb_function: alert( 'User email: ' + a.email ); });
这种写法的优势
receive现在变成了一个“函数工厂”,它接收自定义回调后,返回一个专门处理getEmail结果的函数。因为闭包的特性,返回的函数能一直访问到cb_function,不需要在send里额外写中转逻辑,代码结构更紧凑。
两种方案都能完美实现你的需求,选哪种全看你更喜欢哪种代码风格~
内容的提问来源于stack exchange,提问作者Alexander M.
相关产品推荐
相关产品推荐

