将对象传递给回调的正确方法?

时间:2017-07-11 15:28:30

标签: javascript node.js express

在这个例子中,使用快递,我想通过' res'所以我可以在功能完成时指导页面:

function dostuff(id) {
  console.log(id);
};

app.post('/:id', function(req, res){
  dostuff(req.params.id, function() {
    res.redirect('/');
  });
});

但是' res'不知道。所以我试图将它传递给函数参数:

dostuff(req.params.id, function(res) {

但这不起作用。如何正确地做到这一点?

修改

所以我似乎已经失去了将代码简化为示例的上下文。这是我的原始代码 - 请注意' res'正在传递,但生成的错误是res.redirect不是函数:

app.delete('/todo/:id', function(req, res){
  var id = [req.params.id];
  couch.view('items', 'all_items', {keys: id}, function(err, body, res) {
    if (!err) {
      var row = body.rows[0];
      var id = row.id;
      var rev = row.value.rev;
      couch.destroy(id, rev);
      res.redirect('/todo');
    };
  });
});

2 个答案:

答案 0 :(得分:1)

当你将回调定义为function(err, body, res)时,你期望couch.view将res作为最后一个参数传递,但它没有传递它。

在您的情况下,您应该从参数列表中删除res,这样您就不会隐藏关闭时可用的res

app.delete('/todo/:id', function(req, res){
  var id = [req.params.id];
  couch.view('items', 'all_items', {keys: id}, function(err, body) {
    // Don't define a res argument to this callback, use it from the closure
    ...
    res.redirect('/todo');
  });
});

回答原始问题

你的doStuff需要进行回调,在你的情况下,你不需要通过它,因为它可以通过闭包获得。

function dostuff(id, cb) {
  console.log(id);
  // Faking doing something async
  setTimeout(cb, 1000);
};

app.post('/:id', function(req, res){
  dostuff(req.params.id, function() {
    // res is available from the closure
    res.redirect('/');
  });
});

如果你的回调没有内联定义,这是另一个解决方案。

function dostuff(id, cb) {
  console.log(id);
  // Faking doing something async
  setTimeout(function, 1000);
};

function afterFinished(res) {
   res.redirect('/');
}
app.post('/:id', function(req, res){
  dostuff(req.params.id, afterFinished.bind(null, res));
});

答案 1 :(得分:0)

您可以将res绑定到回调,如下所示:

dostuff(req.params.id, (function(res) {
    res.redirect('/');
}).bind(this, res));