then 语句中的异步 Mongoose 回调

Posted

技术标签:

【中文标题】then 语句中的异步 Mongoose 回调【英文标题】:Async Mongoose callbacks in then statement 【发布时间】:2017-10-09 10:08:13 【问题描述】:

我在使用来自 Mongoose 的 Promise 和异步调用时遇到问题

这是我的代码

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

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

我该如何解决这个问题?

另外请告诉我是否选择了正确的等待来实现我的用例?也许我做错了,还有其他一些最佳实践来处理这个问题。

【问题讨论】:

handler 是什么东西?你应该return你的承诺! 【参考方案1】:

我相信你的第二个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);
            
        );
    );
)

【讨论】:

谢谢,看来这是解决问题的办法了【参考方案2】:

您不得将回调传递给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。

【讨论】:

感谢您的回答,但没有保存它不会传递下一个 then 语句的参数。 @e109848 “不保存”是什么意思?

以上是关于then 语句中的异步 Mongoose 回调的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 异步 .save 和回调

在使用 mongoose 完成两个异步查询后进行回调

Mongoose与bluebird结合使用实例

处理 Mongoose 异步/等待调用中的错误

Promise then中回调为什么是异步执行?Promise执行机制问题

使用轴和 Vue.js 进行异步/等待调用 - `.then()` 回调未更新 `this.something`