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

Bluebird Promise串行迭代,并解决修改后的数组?

姚乐家
2023-03-14
问题内容

我有这个承诺,Item如果在数据库中找不到该新文件,则会创建一个新文件,然后将其存储在以前创建的Collection文件中。

集合文档是数组中的第一个字符串,并且数组中的任何后续索引都会转换为一个或多个Item文档。

Promise.each
“解析为原始数组未修饰的”等等,最后return内的Promise.each被渲染的对象,但在随后.then产生原始阵列..

这是承诺(为便于阅读而缩写):

globalVar = true;
collectionId = "";
var itemSeries = Promise.each(items, function(element) {
    if (globalVar == true) {
        return Models.Collection.findOneAsync({
            "name": element
        })
        .then(function(collection) {
            // promise chain similar to the following else..
            // set the collectionId var to an _id
        });
    } else {
        return Models.Items.findOneAsync({
            "name": element
        })
        .then(function(item) {
            if (item == null) {
                return Models.Labels.findOneAsync({
                    "title": element
                })
                .then(function(label) {
                    var newItem = new Models.Items({
                        name: element,
                        label: label._id
                    });
                    return newItem.saveAsync();
                }).then(function() {
                    return Models.Items.findOneAsync({
                        "name": element
                    });
                }).then(function(item) {
                    item.collection = collectionId;
                    return item.saveAsync();
                }).then(function() {
                    return Models.Items.findOneAsync({
                        "name": element
                    });
                }).then(function(item) {
                    allItems.push(item);
                    console.log("allItems: [ ");
                    console.log(allItems);
                    return allItems;
                });
            }
        });
    }
}).then(function(allItems) {
    console.log("allItems: [ ");
    console.log(allItems);
    return allItems;
});

console.log是Promise.each中的最后一个:

allItems: [ 
[ { _id: 54eec5f2b9fb280000286d52,
    name: 'one',
    label: 54eec5f2b9fb280000286d51,
    collection: 54eec5f2b9fb280000286d50,
    __v: 0 },
  { _id: 54eec5f2b9fb280000286d54,
    name: 'two',
    label: 54eec5f2b9fb280000286d53,
    collection: 54eec5f2b9fb280000286d50,
    __v: 0 } ]

然后在后面.then(function(allItems) {的是最后一个console.log

allItems: [ 
[ 'collectionName', 'one', 'two' ]

另外,可变itemSeries的是= Promise.each后呈现undefined在Promise.join?


问题答案:

.each函数不会更改通过链 传递 的值:

我简化了您的代码,作为输入,我假设:

var items = ['one','two'];

对于您的代码:

Promise.each(items, function(element) {
    return element+'.';
    //return Promise.resolve(element+'.');
})
.then(function(allItems) {
    console.dir(allItems);
});

结果仍然是['one','two']因为这是数组的解析值items。每个内的返回值不会影响传递给链式的值的内容then

.map另一方面,该功能将具有以下效果:

Promise.map(items, function(element) {
    return element+'.';
    //return Promise.resolve(element+'.');
})
.then(function(allItems) {
    console.dir(allItems);
});

在这里,return值value将用于创建新数组,然后将其传递给then。结果是['one.','two.']

allItems您的代码中出现的两个是不同的对象。

编辑 对于映射的串行迭代,我将编写一个如下的辅助函数:

 function mapSeries(things, fn) {
     var results = [];
     return Promise.each(things, function(value, index, length) {
         var ret = fn(value, index, length);
         results.push(ret);
         return ret;
     }).thenReturn(results).all();
 }

资料来源:实施Promise.series



 类似资料:
  • 我有一个json blob,如下所示: 这只是一个在这里发布的例子。在这个例子中,我们看到它提供了一个学校每年发生的所有事件的列表,该列表是一个累积列表,即上一年的事件也会被追加。我们知道的是,每年的活动都将以“会议开始”活动开始。我想通过这件事,以最新的一系列事件结束。请忽略事件名称中的时间戳或年份,它们只是示例,我在现实世界中没有此类信息。我需要的最终结果是: 所以,我想保留从“会话开始”事件

  • 我对java相当陌生,实际上我正在编写一个键盘记录器,并让它定期写入文件。每当用户按下某个键时,它都会实例化一个NativeKeyEvent,该事件调用“param string()”并将信息作为字符串添加到下面的arraylist中... 然后,在每一个间隔,字符串数组被传递,并被写入下面的TimerTask线程中的文件。 行'str=iterator.next().tostring();‘然后

  • 当我使用temp=iterator.next()时,sort方法会导致并发修改错误。你能帮我解决并发修改错误吗。我给出了整个类的代码,但我只是尝试完成sort方法。事先谢谢你的帮助。 我必须对ArrayList中的所有数组进行排序。

  • 我正在从数据库resultset获取一个巨大的ArrayList,并尝试在Java中迭代它(尝试从中获取值)。在对其进行迭代时,我在一个特定的行上得到一个concurrentModificationException我尝试使用各种解决方案,但却一次又一次地得到相同的错误,我在下面发布代码 我在myDTo.getsom_num().ToString()这一行上遇到异常。有谁能帮我解决这个问题吗

  • 比如说,我做了如下事情: 其中通过几层代码间接地为

  • 问题内容: 我知道您不应在遍历列表时添加/删除项目。但是,如果不更改列表长度,是否可以修改要迭代的列表中的项目? 还是应该迭代列表索引?像那样: 问题是:以上两种方式都是允许的,还是只有第二种是没有错误的? 如果答案是肯定的,以下代码段是否有效? UPD。我想在python文档中看到“允许这些操作”而不是某人的假设。 问题答案: 可以这么说,您 不是在 修改列表。您只是在修改列表中的元素。我不认为