有以下代码:
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输出,但在第二种情况下,我可以看到空输出。为什么?
答案 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);
});
});