当前位置: 首页 > 面试题库 >

Bluebird Promisfy.each,带有for循环和if语句?

商曦
2023-03-14
问题内容

现在,父级for循环(m < repliesIDsArray.length)在第一个findOne触发之前完成,因此,这仅循环通过repliesIDsArray..asynchronous。的最后一个元素。

此代码集的承诺版本的正确语法是什么?Promisification的新手,想知道如何开始Promisify +遍历数组+解释if语句。

蓝鸟是必需的,并且Promise.promisifyAll(require("mongoose"));被调用。

for(var m=0; m<repliesIDsArray.length; m++){

objectID = repliesIDsArray[m];

Models.Message.findOne({ "_id": req.params.message_id},
    function (err, doc) {
        if (doc) {
         // loop over doc.replies to find the index(index1) of objectID at replies[index]._id
         var index1;
         for(var i=0; i<doc.replies.length; i++){
            if (doc.replies[i]._id == objectID) {
                index1 = i;
                break;
            }
         }
         // loop over doc.replies[index1].to and find the index(index2) of res.locals.username at replies[index1].to[index2]
         var index2;
         for(var j=0; j<doc.replies[index1].to.length; j++){
            if (doc.replies[index1].to[j].username === res.locals.username) {
                index2 = j;
                break;
            }
         }

         doc.replies[index1].to[index2].read.marked = true;
         doc.replies[index1].to[index2].read.datetime = req.body.datetimeRead;
         doc.replies[index1].to[index2].updated= req.body.datetimeRead;
         doc.markModified('replies');
         doc.save();
    }
}); // .save() read.marked:true for each replyID of this Message for res.locals.username

} // for loop of repliesIDsArray

问题答案:

正如本杰明所说,不要使用for循环,而应使用Promise.each(或.map

在此处查看Bluebird
API文档,然后搜索“静态地图示例:”。与map相比,对于Doc的理解更清晰each

var Promise = require('bluebird')
// promisify the entire mongoose Model
var Message = Promise.promisifyAll(Models.Message)

Promise.each(repliesIDsArray, function(replyID){
    return Message.findOneAsync({'_id': req.params.message_id})
        .then(function(doc){
            // do stuff with 'doc' here.  
        })
})

从文档中,.each(或.map)采用“ an array, or a promise of an array, which contains promises (or a mix of promises and values)”,这意味着您可以将其与100%纯值数组一起使用以启动承诺链

希望能帮助到你!



 类似资料:
  • 对Java来说很新鲜,我在大学的一个入门班做一个项目。我正在尝试做一个方法,在String数组中搜索输入的状态并返回索引。如果用户输入不在数组中的查询,我希望它要求一个新的状态来搜索。我的例外是说“变量statePotion可能尚未初始化。”下面是代码。 提前谢谢!

  • 我正在尝试填充一个名为的组件中的数组,它是的数组。每个还有一个列表。 因此,目前,我正在处理两个api调用,它们是: 和 我使用获取所有进程,并首先填充数组。然后我使用每个的进程id来调用第二个API,以获取该进程的任务。 当前,我的代码看起来如下所示: 我知道我可以创建一个observables数组,并使用等待所有这些异步调用完成,但我希望能够为每个调用定义订阅回调函数,因为我需要对的引用。我有

  • 问题内容: 目前无法打破此循环。如果要在此列表中找不到变量,我想破坏它,以便它可以移动另外两个循环。它期望在循环的顶部有一个缩进的块,但是如果更改循环的开头或开头的位置,它将无法正常工作。救命! 问题答案: 正如人们在对您的问题的评论中提到的那样,您需要分别打破每个循环,仅停止其所在的循环 两个 循环都需要这样做 如果您也想打破while循环,那么您也可以添加该循环。

  • 我有一个380行20列的表格。我想从该表中删除符合特定条件的行。 为了澄清问题,假设我有以下列表: 我想删除在列表中找到姓名的所有人员的数据。 例如,假设我的数据如下所示: 我想删除、和的数据。所以输出应该是: 我的代码正在运行,但数据没有从我的原始数据中删除。当我打开新的测试.txt文件时,我可以看到数据没有被删除。 我可以肯定错误在< code > if data[row][0]= =(I f

  • 问题内容: 我有一个二维布尔数组’poorSignal’,需要编写一个返回网格的方法,如果数组上的某个点为true,则显示X,如果为false,则显示O。这是我的代码: 当我编译时,它在方法的最后一行给出了“丢失的返回语句”。我也不确定在打印数组时’return“ \ n”是否可以添加新行。 这是一个分配问题,所以我不能直接打印它,也不能仅打印布尔值-它必须是产生网格的方法。 问题答案: 编译器无

  • 问题内容: 我知道如何在单独的行上同时使用for循环和if语句,例如: 而且我知道当语句很简单时,我可以使用列表推导来组合这些内容,例如: 但是我找不到一个很好的例子,可以在任何地方(复制和学习)演示一组复杂的命令(不仅仅是“ print x”),这些命令是在for循环和某些if语句组合后发生的。我期望的是: 这不是python应该工作的方式吗? 问题答案: 您可以使用以下生成器表达式: