2015-10-04 1 views
2

Существует следующий код:Node.js promisses цепочки

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 выход, но во втором я могу видеть пустой вывод. Зачем?

ответ

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); 
    }); 
}); 

Когда вы возвращаетесь обещание от более раннего обработчика в цепочке, последующие обработчики ждать его (и получить его значение разрешения).


Side Примечание: Не забывайте обрабатывать сбои в обещаниях, тоже с помощью второго аргумента then и/или с помощью catch.

+0

Пожалуйста, скажите, как я могу проверить, не задана ли задача для NULL для обновления атрибутов? Благодаря! – malcoauri

+0

@malcoauri: * Может * 'task' быть' null'? (Я не знаком с данным lib, но я ожидал бы, что отклоню обещание, а не разрешу его с помощью «null».) Если это так, достаточно простого 'if (task == null)'. В этом случае вы, скорее всего, вернете задачу, а не вернете обещание от 'task.updateAttributes'. Последующие обработчики 'then' получат' null' (немедленно). –

2

Вы должны вернуть 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); 
    }); 
}); 
Смежные вопросы