Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有自定义aguments的Javascript回调_Javascript_Node.js_Asynchronous - Fatal编程技术网

带有自定义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
是一个数组。我想他不是在问如何给自己传递回调。他是