Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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
Javascript 将变量绑定到回调函数_Javascript_Node.js - Fatal编程技术网

Javascript 将变量绑定到回调函数

Javascript 将变量绑定到回调函数,javascript,node.js,Javascript,Node.js,我正在从请求处理程序调用一些数据库函数。所有这些函数都有单独的“错误回调”来处理错误。例如: function referralComplete(req, res) { /*getting id etc.*/ db.startDatabaseConnection(function() { db.flagReferralAsDone(id, function(success) { db.endDatabaseConnection();

我正在从请求处理程序调用一些数据库函数。所有这些函数都有单独的“错误回调”来处理错误。例如:

function referralComplete(req, res) {
    /*getting id etc.*/
    db.startDatabaseConnection(function() {
        db.flagReferralAsDone(id, function(success) {
            db.endDatabaseConnection();
            /*doing stuff on success*/
        }, onError);
    }, onError);

    function onError(err, description) {
        logger.error(description + ": " + err);
        user.pageNotFound(req, res);
    }
}
我有几个与此类似的请求处理程序,它们都调用不同的数据库函数。目前,我已经将
onError()
复制到了它们各自的范围内,因为在处理错误时,我需要
req
res
,但我认为可能有一种方法可以在不复制的情况下实现同样的效果

所以问题是,是否有可能以某种方式将
req
res
绑定到
onError()
,这样我就不必将
onError()
复制到每个请求处理程序中?

绑定很简单

db.startDatabaseConnection(function(){
  // whatever
}, onError.bind(this, var1, var2));

这是一个真正的基本演示

// a function
var something = function (a, b, c) {
  console.log(a, b, c);
};

// a binding of something with 3 defined args
var b = something.bind(null, 1, 2, 3);

// call b
b();
//=> 1 2 3
在幕后,这基本上就是正在发生的事情

// ES6
const myBind = (f, context, ...x) =>
  (...y) => f.call(context, ...x, ...y);

// ES5
var myBind = function(fn, context) {
  var x = Array.prototype.slice.call(arguments, 2);
  return function() {
    var y = Array.prototype.slice.call(arguments, 0); 
    return fn.apply(context, x.concat(y));
  };
};

var b = myBind(console.log, console, 1, 2, 3);

b();
// => 1 2 3

b(4,5,6)
// => 1 2 3 4 5 6 

上下文?

上下文允许您动态更改函数的
。注意:您只能绑定使用
function
关键字定义的函数的上下文;箭头函数具有无法操作的词法
。这是为了完整性而显示的,但我建议不要使用这种程序。通常最好只使用另一个函数参数,而不是依赖动态函数上下文,
this
。支持这样的上下文切换是为了在JavaScript中启用面向对象的样式。除非您使用这种风格,否则我认为没有理由关注上下文

const getCanvas=(id)=>
document.getElementById(id).getContext('2d')
常量绘制=函数(画布,x=0,y=0)
{canvas.beginPath()
canvas.strokeStyle=this.color/`this`指的是上下文!
canvas.rect(x,y,this.width,this.height)/`this`表示上下文!
canvas.stroke()
}
//创建两个上下文
常量上下文=
{颜色:'蓝色',宽度:10,高度:10}
常量上下文B=
{颜色:“绿色”,宽度:10,高度:20}
//将draw函数绑定到每个上下文和画布
康斯特德拉瓦=
draw.bind(contextA,getCanvas('main'))
恒速牵引=
draw.bind(contextB,getCanvas('main'))
//正常调用绑定的绘图函数
//画三个蓝色正方形
drawA(0,0)
drawA(20,0)
drawA(40,0)
//还有一个绿色矩形
drawB(80,0)
绑定很简单

db.startDatabaseConnection(function(){
  // whatever
}, onError.bind(this, var1, var2));

这是一个真正的基本演示

// a function
var something = function (a, b, c) {
  console.log(a, b, c);
};

// a binding of something with 3 defined args
var b = something.bind(null, 1, 2, 3);

// call b
b();
//=> 1 2 3
在幕后,这基本上就是正在发生的事情

// ES6
const myBind = (f, context, ...x) =>
  (...y) => f.call(context, ...x, ...y);

// ES5
var myBind = function(fn, context) {
  var x = Array.prototype.slice.call(arguments, 2);
  return function() {
    var y = Array.prototype.slice.call(arguments, 0); 
    return fn.apply(context, x.concat(y));
  };
};

var b = myBind(console.log, console, 1, 2, 3);

b();
// => 1 2 3

b(4,5,6)
// => 1 2 3 4 5 6 

上下文?

上下文允许您动态更改函数的
。注意:您只能绑定使用
function
关键字定义的函数的上下文;箭头函数具有无法操作的词法
。这是为了完整性而显示的,但我建议不要使用这种程序。通常最好只使用另一个函数参数,而不是依赖动态函数上下文,
this
。支持这样的上下文切换是为了在JavaScript中启用面向对象的样式。除非您使用这种风格,否则我认为没有理由关注上下文

const getCanvas=(id)=>
document.getElementById(id).getContext('2d')
常量绘制=函数(画布,x=0,y=0)
{canvas.beginPath()
canvas.strokeStyle=this.color/`this`指的是上下文!
canvas.rect(x,y,this.width,this.height)/`this`表示上下文!
canvas.stroke()
}
//创建两个上下文
常量上下文=
{颜色:'蓝色',宽度:10,高度:10}
常量上下文B=
{颜色:“绿色”,宽度:10,高度:20}
//将draw函数绑定到每个上下文和画布
康斯特德拉瓦=
draw.bind(contextA,getCanvas('main'))
恒速牵引=
draw.bind(contextB,getCanvas('main'))
//正常调用绑定的绘图函数
//画三个蓝色正方形
drawA(0,0)
drawA(20,0)
drawA(40,0)
//还有一个绿色矩形
drawB(80,0)

链接很长,但它指向的内容并不多:)非常感谢您在尝试了几个小时后给出的清晰解释,我终于明白了——我在ajax成功回调中遇到了回调函数的问题,总是将其作为窗口对象而不是对象返回callbackFunc.bind($self)(cart);`解决了它链接很长,但它指向的内容并不多非常感谢您在尝试了几个小时后给出的清晰解释,我终于明白了——我在ajax成功回调中遇到了回调函数的问题,总是将其作为窗口对象而不是对象返回callbackFunc.bind($self)(cart);`解决了