Node.js承诺链接

时间:2015-10-04 07:06:35

标签: javascript node.js

有以下代码:

router.put('/:id', function(req, res) {
  models.Task.find(req.params.id).then(function(task) {
    task.updateAttributes({
      title: req.body.title,
      description: req.body.description
    }).then(function(task) {
      res.json(task);
    })
  });
});

我正在尝试按照以下方式重新考虑此代码:

router.put('/:id', function(req, res) {
  models.Task.find(req.params.id).then(function(task) {
    task.updateAttributes({
      title: req.body.title,
      description: req.body.description
    })
  }).then(function(task) {
    res.json(task);
  });
});

在第一种情况下,我可以看到正确的JSON输出,但在第二种情况下,我可以看到空输出。为什么?

2 个答案:

答案 0 :(得分:4)

您不再等待updateAttributes完成了。但是,您只需添加return

即可
router.put('/:id', function(req, res) {
  models.Task.find(req.params.id).then(function(task) {
    return task.updateAttributes({
//  ^^^^^^
      title: req.body.title,
      description: req.body.description
    });
  }).then(function(task) {
    res.json(task);
  });
});

当你从链中的早期处理程序返回一个promise时,后续的处理程序会等待它(并接收它的分辨率值)。

附注:请记住通过使用then的第二个参数和/或使用catch来处理承诺中的失败。

答案 1 :(得分:2)

你需要回复第二个承诺:

router.put('/:id', function(req, res) {
  models.Task.find(req.params.id).then(function(task) {
    return task.updateAttributes({
      title: req.body.title,
      description: req.body.description
    });
  }).then(function(task) {
    res.json(task);
  });
});