带有异步操作的猫鼬游标

Posted

技术标签:

【中文标题】带有异步操作的猫鼬游标【英文标题】:Mongoose cursor with async operations 【发布时间】:2018-05-21 05:18:19 【问题描述】:

我是 mongo 的新手,现在淹没在大量文档中。我只想使用 mongoose 游标与游标内的数据操作异步工作。它应该等待播放下一次迭代,直到操作完成。 我读到我们可以通过

QueryCursor#eachAsync(fn, [options], [options.parallel], [callback])

如果 fn 返回一个承诺,将等待承诺解决

由于我是 mongo 的新手,我不知道如何创建一个承诺并在以后解决它。

var cursor = Users.find( "is_verified" : false ).cursor();
cursor.eachAsync(function (doc)  
    //create promise here
    async.series(
       one: function(callback)
          callback(null,1);
       ,
       two: function(callback)
          callback(null,2);
       ,
       three: function(callback)
          callback(null,3);
       ,
       four: function(callback)
          //resolve promise here
          if() callback(null,4)
       ,
   ,function(err,result))


).then(()=>console.log('FINISHED'));

【问题讨论】:

你能再清楚一点吗?我想帮忙。 我想要做的就是从我的数据库中获取数据一个接一个地对它们执行操作(这将在 html 模板中提供数据并向用户发送邮件),这将是一个一系列异步操作并不断重复所有数据。 所以流程类似于: find(1) -> waitForFindFinish(1) -> storeInVariable(1) -> find(2) -> waitForFindFinish(2) -> storeInVariable(2) ->... -> find(n) -> waitForFindFinish(n) -> storeInVariable(n) ??? find(1) -> waitForFindFinish(1) -> feedDetailInTemplate(1) -> sendMailofTemplate(1) -> find(2) -> waitForFindFinish(2) -> feedDetailInTemplate(2) - > sendMailofTemplate(2)...... 所以只有find的参数在变? 【参考方案1】:

我会在这样的数组中调用你的函数: [这是半伪代码]

for(parameter in parameters) 
  users.find("parameter":parameter, function( err, data) 
    if (err) return handleError(err);
    functionToFeedTemplate(data);
    functionToSendMail(data);
  

【讨论】:

感谢您的回答,但我采取了一种方式。通过返回一个空承诺并在async.series([...])的call_back中解决它

以上是关于带有异步操作的猫鼬游标的主要内容,如果未能解决你的问题,请参考以下文章

如何使用节点异步来获取我的猫鼬电话?

在猫鼬中执行 CRUD 操作时异步/等待

如何在猫鼬模式中使用异步默认值?

带有打字稿的猫鼬,来自猫鼬的错误“连接”

带有数组的猫鼬模式

带有数组的猫鼬模式