蓝鸟承诺:循环猫鼬结果

Posted

技术标签:

【中文标题】蓝鸟承诺:循环猫鼬结果【英文标题】:Bluebird promise: loop over mongoose result 【发布时间】:2016-06-04 14:19:43 【问题描述】:

我通过 Mongoose(MEAN 环境)从 MongoDB 查询作者数据。作者数据还包含作者编写的一系列书籍(-> results.books)。收到后,我想遍历这一系列书籍并检查某些值。这是我目前的代码。

return Author.findOne(_id: req.user._id, '-username').execAsync()
.then(function(results) 

return Promise.each(results.books) //this line causes TypeError rejection
).then(function(book)     
   console.log('book:'+book); // test output
   if(book==='whatever‘)
      //do foo
     
).catch(function(err)
    console.log('Error: '+err);
);

不幸的是,我无法让它工作,因为它不断给我上面标记的行的拒绝类型错误。我尝试在此处应用此解决方案 (Bluebird Promisfy.each, with for-loops and if-statements?) 但它不会成功,因为它似乎也是一种不同类型的问题。

【问题讨论】:

findOne 真的返回一个数组吗?我不知道 - 但猜你得到了一个对象,但 each 需要一个数组 根据doc,findOne 应该返回一个可能为空的单个文档 【参考方案1】:

Bluebird 的Promise.each() 采用一个可迭代对象和一个迭代器回调函数,该函数将为可迭代对象中的每个项目调用。您没有传递回调函数。当整个迭代完成时,Promise.each() 之后的 .then() 处理程序将被调用。看起来您希望它成为迭代器 - 事实并非如此。

Promise.each() 的 Bluebird 文档是 here。

我不确定你想要完成什么,但也许这就是你想要的:

return Author.findOne(_id: req.user._id, 'username').execAsync()
   .then(function (results) 
        return Promise.each(results.books, function(book) 
            console.log('book:' + book); // test output
            if (book === 'whatever‘) 
               //do foo
            
        );
    ).then(function() 
        // Promise.each() is done here
    ).catch(function (err) 
        console.log('Error: ' + err);
    );

【讨论】:

这似乎有效。谢谢!我想,我需要回去做更多的阅读承诺,以获得更深入的理解,仍然在基本问题上苦苦挣扎 - 真可惜。再次感谢。 还有一件事:除了抛出异常之外,有没有办法提前(在到达数组末尾之前)退出 .each() 循环?类似于'break;'的东西在while循环或简单的'return;'对方?在 Bluebird 文档中找不到任何内容。 @IgorP。 - 除了抛出或返回被拒绝的承诺之外,我不知道有任何方法可以提前退出 - 这两种方法都会导致返回的承诺被拒绝。

以上是关于蓝鸟承诺:循环猫鼬结果的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬承诺与蓝鸟和打字稿

猫鼬静态方法返回一个蓝鸟承诺

带有护照js的蓝鸟错误的猫鼬承诺

带有多个猫鼬查找的foreach循环后的javascript承诺

在 for 循环中链接猫鼬承诺

蓝鸟承诺未定义?