Обещания Mongoose es6, обратный вызов exec

#node.js #mongoose

#node.js #mongoose

Вопрос:

Я не уверен, что понимаю разницу и преимущества перехода от классических обратных вызовов mongoose и обещаний ES6. Этот агрегированный запрос

 router.get('/', function(req,res) {
caseNote.aggregate([
        {$unwind: '$field'},
        {$match: {field: "aaa"}},
        {$project: {field: 1, _id: 0}}
    ])
    .exec(function(err, data) {
        if (err)
            res.json(err);
        else {
            if(data[0])
                res.json(data[0].field);
            else
                res.json([]);
        }
    });
});
 

с некоторым количеством сахара ES6 будет включен

 router.get('/', cache, function(req,res) {
    caseNote.aggregate([
        {$unwind: '$field'},
        {$match: {field: "aaa"}},
        {$project: {field: 1, _id: 0}}
    ])
        .exec()
        .then(data => res.json(data[0] ? data[0].field: {error:"result error"}))
        .catch(err => res.json(err) );

});
 

почему я предпочел then() amp; catch() бы brothers вместо exec() обратного вызова?

Ответ №1:

С обещаниями ES6 код становится более чистым и читаемым, поскольку вы можете воспользоваться преимуществами catch() метода и обрабатывать ошибки в одном блоке кода.

В этом конкретном примере я не вижу большой разницы, поскольку нет множественных обратных вызовов.

Это отличная статья, в которой гораздо больше деталей.

https://github.com/getify/You-Dont-Know-JS/blob/master/async & performance/ch3.md

Комментарии:

1. Я прочитаю весь репозиторий, спасибо. В то же время, побочный вопрос: будут ли генераторы ES6 «перегнаны» обещаниями или у них разные цели?

2. Ну, генераторы имеют много разных применений, но на самом деле, я думаю, что все будет наоборот, поскольку асинхронные функции ES7 основаны на генераторах. Это действительно хорошее чтение! rossboucher.com/await /#