Javascript回调与自定义参数

时间:2012-05-10 15:21:34

标签: javascript node.js asynchronous

我正在尝试研究如何在节点中实现异步回调,因为我不知道参数可能是什么。

我将说明我正在尝试做的同步版本,以便更清楚。

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

5 个答案:

答案 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);

http://jsfiddle.net/S4tH6/

答案 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);
};