我正在尝试研究如何在节点中实现异步回调,因为我不知道参数可能是什么。
我将说明我正在尝试做的同步版本,以便更清楚。
function isAuthorized(userID){
// check for user Permissions here
return isAuthorized;
}
使用此任何函数都可以调用它,并从它返回的值中确定用户是否已获得授权。但是,我用来获取userID(并检查权限)的函数都是异步函数并需要回调。但是当我不知道回调中需要的参数时,我不知道如何实现它。
调用它的函数可能想要向回调发送一些参数(通常它只是等待同步返回)这就是令我困惑的事情。
function isAuthorized(socket, callback, args){
socket.get('userID', function (err, userID) {
//check userID for permission
callback(args);
});
}
我意识到我可以将参数转换为数组并发送该数组,但是我想知道是否有一种更通用的方法来做到这一点,这并没有强迫我让所有的回调都从一个参数数组转换
希望你能提供帮助, Pluckerpluck
答案 0 :(得分:1)
我不确定,如果我理解你的方法正确,但似乎你正在寻找函数中的arguments
对象(MDN link)。
基本上,您不必事先指定任何参数,而是让函数查找存在的参数。所以你可以做以下的事情:
function myFunc() {
for (var i=0; i<arguments.length; ++i ) {
console.log( arguments[i] );
}
}
这会产生类似
的输出myFunc( 1 );
> 1
myFunc( 's', 3, 'S' );
> "s"
> 3
> "S"
答案 1 :(得分:1)
您始终可以创建一个函数将这些参数拉入数组中,然后在每个异步函数中重用它:
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');
有一个小小的here可以玩。
答案 2 :(得分:1)
因此,在构建API时,您可以指定将参数传递给回调的顺序。因此,您需要很好地评论您的代码,以便使用您的API的任何人都能理解他们将从您的方法中获得什么。
听起来你可能想要传回不同的参数,这取决于传入的回调函数的样子。传统上,这不是API的工作原理。这需要相当长的时间才能有效地完成。
我建议将对象传递给回调。 Object可以有多个参数,人们可以从中提取出来。这将简化未来的增强,因为您可以非常简单地向该对象添加一个额外的属性,而不会弄乱每个人的方法实现。所以,回复这样的事情:
{
"id": "Some_ID",
"message": "Some Message",
"isAuthorized" : true
}
这样,使用您的API的任何人都不必在回调方法中考虑多个参数。他们知道他们只会得到一个arg,并且它将是一个具有多个属性的Obj,并且他们可以消耗他们想要的属性。此外,将来您可以添加第4或第5个属性而不会破坏其代码。您可以添加“datetime”属性,它们的代码将保持不变。您将获得向后兼容性,然后新的实现者可以使用新属性。
答案 3 :(得分:0)
如果我理解正确,请不要将它们作为参数传递:
var a = "something";
var b = "something";
var callback = function(){
// use a and b here
};
isAuthorized(socket, callback);
答案 4 :(得分:0)
在咖啡脚本中你有一些名为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);
};