带有自定义aguments的Javascript回调
考虑到我不知道参数可能是什么,我正在尝试解决如何在节点中实现异步回调 我将说明我正在尝试执行的同步版本,以便更清楚地说明这一点带有自定义aguments的Javascript回调,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,考虑到我不知道参数可能是什么,我正在尝试解决如何在节点中实现异步回调 我将说明我正在尝试执行的同步版本,以便更清楚地说明这一点 function isAuthorized(userID){ // check for user Permissions here return isAuthorized; } 使用此函数,任何函数都可以调用它,并根据它返回的值确定用户是否被授权。但是,我用来获取用户ID(并检查权限)的函数都是异步函数,需要回调。但是,当我不知道回调中所需的参数时,我
function isAuthorized(userID){
// check for user Permissions here
return isAuthorized;
}
使用此函数,任何函数都可以调用它,并根据它返回的值确定用户是否被授权。但是,我用来获取用户ID(并检查权限)的函数都是异步函数,需要回调。但是,当我不知道回调中所需的参数时,我不知道如何实现它
调用此函数的函数可能希望向回调函数发送大量参数(通常它只是等待同步返回),这让我感到困惑
function isAuthorized(socket, callback, args){
socket.get('userID', function (err, userID) {
//check userID for permission
callback(args);
});
}
我意识到我可以将参数转换成一个数组并发送该数组,但我想知道是否有一种更通用的方法来做到这一点,而不是强迫我将所有回调从一个参数数组转换
希望你能帮忙,
如果我理解正确,请不要将它们作为参数传递:
var a = "something";
var b = "something";
var callback = function(){
// use a and b here
};
isAuthorized(socket, callback);
如果我理解正确,请不要将它们作为参数传递:
var a = "something";
var b = "something";
var callback = function(){
// use a and b here
};
isAuthorized(socket, callback);
我不确定我是否正确理解了您,但您似乎在函数()中寻找
参数对象
基本上,您不必预先指定任何参数,而是让函数查找存在哪些参数。因此,您可以执行以下操作:
function myFunc() {
for (var i=0; i<arguments.length; ++i ) {
console.log( arguments[i] );
}
}
我不确定是否正确理解了您,但您似乎在函数()中寻找参数对象
基本上,您不必预先指定任何参数,而是让函数查找存在哪些参数。因此,您可以执行以下操作:
function myFunc() {
for (var i=0; i<arguments.length; ++i ) {
console.log( arguments[i] );
}
}
您始终可以创建一个函数,将这些参数拉入数组,然后在每个异步函数中重用它:
function asyncWithCallbackArgs(obj, callback) {
var args = Array.prototype.slice.call(arguments, 2);
callback.apply(obj, args);
}
这将使您能够执行以下操作:
function callback (c, d, e, f) {
console.log([c, d, e, f]);
}
asyncWithCallbackArgs({}, callback,'c','d','e','f');
有一把小提琴可以玩。您可以创建一个函数,将这些参数拉入数组,然后在每个异步函数中重用它:
function asyncWithCallbackArgs(obj, callback) {
var args = Array.prototype.slice.call(arguments, 2);
callback.apply(obj, args);
}
这将使您能够执行以下操作:
function callback (c, d, e, f) {
console.log([c, d, e, f]);
}
asyncWithCallbackArgs({}, callback,'c','d','e','f');
有一把小提琴可以玩。在咖啡脚本中,你有一种叫做splats的东西
( socket, callback, args... )->
callback args...
这在Javascript中翻译为以下内容:
var __slice = [].slice;
function() {
var args, callback, socket;
socket = arguments[0], callback = arguments[1], args = 3 <= arguments.length ?__slice.call(arguments, 2) : [];
return callback.apply(null, args);
};
var\uuu slice=[].slice;
函数(){
变量args,回调,套接字;
socket=arguments[0],callback=arguments[1],args=3在Coffee脚本中,您有一个称为splats的东西
( socket, callback, args... )->
callback args...
这在Javascript中翻译为以下内容:
var __slice = [].slice;
function() {
var args, callback, socket;
socket = arguments[0], callback = arguments[1], args = 3 <= arguments.length ?__slice.call(arguments, 2) : [];
return callback.apply(null, args);
};
var\uuu slice=[].slice;
函数(){
变量args,回调,套接字;
socket=arguments[0],callback=arguments[1],args=3因此,在构建API时,您需要指定参数传递到回调中的顺序。因此,您需要对代码进行良好的注释,以便使用API的任何人都能理解他们将从您的方法中得到什么
听起来您可能想传回不同的参数,这取决于传入的回调函数的外观。传统上API不是这样工作的。要有效地做到这一点需要相当长的时间
我建议向回调传递一个对象。该对象可以有多个参数,人们可以从中提取。这将简化未来的增强,因为您可以非常简单地向该对象添加一个附加属性,而不会扰乱每个人对方法的实现。因此,返回类似以下内容:
{
"id": "Some_ID",
"message": "Some Message",
"isAuthorized" : true
}
这样,使用您的API的任何人都不必考虑回调方法中的多个参数。他们知道,他们只会得到一个参数,并且这将是一个具有多个属性的Obj,他们可以使用他们想要的属性。此外,将来您可以添加第四个或第五个属性,而不会破坏它们的代码。Yo你可以加上一个“日期时间”属性,它们的代码将保持不变。您将获得向后兼容性,新的实现者可以使用新的属性。因此,当您构建API时,您可以指定参数传递到回调中的顺序。因此,您希望对代码进行注释,以便使用您的API的任何人都可以理解它们的含义我会从你的方法中恢复过来
听起来您可能想传回不同的参数,这取决于传入的回调函数的外观。传统上API不是这样工作的。要有效地做到这一点需要相当长的时间
我建议向回调传递一个对象。该对象可以有多个参数,人们可以从中提取。这将简化未来的增强,因为您可以非常简单地向该对象添加一个附加属性,而不会扰乱每个人对方法的实现。因此,返回类似以下内容:
{
"id": "Some_ID",
"message": "Some Message",
"isAuthorized" : true
}
这样,使用您的API的任何人都不必考虑回调方法中的多个参数。他们知道,他们只会得到一个参数,并且这将是一个具有多个属性的Obj,他们可以使用他们想要的属性。此外,将来您可以添加第四个或第五个属性,而不会破坏它们的代码。Yo你可以添加一个“datetime”属性,它们的代码将保持不变。你将获得向后兼容性,新的实现者可以使用新的属性。你熟悉Function.appy()
或Function.call()
?你可以简单地做到这一点:callback.apply(这是args)
,其中args
是一个数组。你熟悉Function.appy()
或Function.call()
?你可以简单地这样做:callback.apply(this,args)
,其中args
是一个数组。我想他不是在问如何给自己传递回调。他是