在then语句中的Async Mongoose回调

时间:2017-05-10 16:17:53

标签: node.js mongodb mongoose promise es6-promise

我遇到使用来自Mongoose

的promises和异步调用的问题

这是我的代码

 req.checkBody(BookManager.SCHEME);
        req.getValidationResult()
            .then(function (result) {
                if (!result.isEmpty()) {
                    handler.onError('Invalid payload');
                    return;
                }
                return new BookModel({
                    author: data.author,
                    name: data.name,
                    year: data.year
                });
            })
           .then((book) => {
            BookModel.find({name: book.name}, function (err, docs) {
                if (docs.length) {
                    throw new Error("Book already exists");
                } else {
                    return book;
                }
            });
            })
            .then((book) => {
                book.save();
            })
            .then((saved) => {
                handler.onSuccess(saved);
            })
            .catch((error) => {
                handler.onError(error.message);
            });

从上面的代码中可以看出。我正在检查这样的书是否已经存在,为了做到这一点,我使用了在主程序计数器"之后调用的异步查找方法。已经走得更远了。

我该如何解决这个问题?

还请告诉我,我是否选择了正确的等待来实现我的用例?也许我做错了,还有一些其他最好的做法可以解决这个问题。

2 个答案:

答案 0 :(得分:1)

您不得将回调传递给BookModel.find()以取回承诺。此外,您不能忘记return来自then回调的承诺继续链接:

req.getValidationResult().then(result => {
    if (!result.isEmpty()) {
        throw 'Invalid payload';
    }
    return new BookModel({
        author: data.author,
        name: data.name,
        year: data.year
    });
}).then(book =>
    BookModel.find({name: book.name}).then(docs =>
        book
    , err => {
        throw new Error("Book already exists");
    })
).then(book =>
    book.save()
).then(handler.onSuccess, handler.onError);

我还修复了your problem with the invalid payload

答案 1 :(得分:0)

我相信你的第二个then(..)应该更像这样:

.then(function(book){
    return new Promise(function(resolve, reject){
        BookModel.find({ name: book.name }, function(err, docs) {
            if (docs.length) {
                reject({message: "Book already exists"});
            } else {
                resolve(book);
            }
        });
    });
})