嵌套的Promise.map()不返回任何结果

时间:2016-11-22 09:12:27

标签: javascript node.js promise bluebird

我正在尝试使用promises来执行循环内部循环。我希望内部循环应该完成它的迭代,然后外部循环应该迭代。

例如: -

arr1 = [1,2,3,4];
arr2 = [5,6,7,8];

loopOfArr1{
    loopOfArr2{
        //functionality
    }
}

我想要arr1的每个值,arr2的循环应该被执行。这将是两个循环将如何完成同步。

这是我使用promises的代码: -

exports.getAtpagesWeights = function(atpagesDataArray,selectedTagsIds, taggings, callback){
    var atpageData, forHubCount;
    return Promise.map(selectedTagsIds, function(tag, index, count){
        return Promise.map(taggings, function(tagging, index, count){
            return new Promise(function(resolve, reject){
                var atpageArray = _.filter(atpagesDataArray, function(item){
                    if(tagging.taggable_id == item.id && tagging.tag_id == tag){
                        item = item.toObject();
                        item.rank_weight = tagging.atpages_weight;
                        resolve(item);
                    }
                })
            })
        })       
    }).then(function(result){
        console.log(result);
        callback(null, result);
    }).catch(function(error){
        callback(error, null);
    })
}

但是当我检查日志时,没有任何内容被打印出来,任何人都可以告诉我哪里出错了,还是有更好的方法?

2 个答案:

答案 0 :(得分:2)

就我对代码的理解而言,你想要的东西就像这样简单:

exports.getAtpagesWeights = function (atpagesData, selectedTagIds, taggings) {
    var atpagesIndex = {},
        atpagesWeights = atpagesData.map(item => {
            var weighted = item.toObject();
            weighted.rank_weight = null;
            atpagesIndex[item.id] = weighted;
            return weighted;
        });

    taggings.filter(t => selectedTagIds.includes(t.id)).forEach(t => {
        atpagesIndex[t.taggable_id].rank_weight = t.atpages_weight;
    });

    return atpagesWeights;
};

这将返回直接从atpagesData项派生的平面对象数组,并为选定项添加rank_weight

作为一般规则:异步延续回调仅用于一个目的和一个目的:处理异步操作。

Promise是继续之上的一个抽象级别。从本质上讲,它们是一次性回调,具有更好的处理能力,但它们仍然是回调的核心。

如果您的代码没有任何异步路径(并且您的代码示例看起来不像),那么您不需要callback参数,也不需要任何承诺。保持简单。

答案 1 :(得分:1)

1)阅读有关_.filter方法的更多信息,您的用法是错误的

2)Last Promise没有解决而不是拒绝,所以你的控制台什么都不打印

3)相反,这种结构(如果不是无效)

 return new Promise(function(resolve, reject){
     resolve(somthing)
 })

更好地使用这种结构

return Promise.resolve()
    .then(function(){
        return somthing;
    })

4)我为你的代码添加了一些优雅

exports.getAtpagesWeights = function(atpagesDataArray, selectedTagsIds, taggings, callback){
    var atpageData, forHubCount;
    return Promise.map(selectedTagsIds, function(tag, index, count){
        return Promise.resolve()
            .then(function() {
                return Promise.filter(taggings, function(tagging) {
                    return tagging.tag_id === tag;
                })
             })
            .then(function(taggings) {
                return Promise.filter(atpagesDataArray, function(item) {
                    return _.chain(taggings)
                        .map('taggable_id')
                        .includes(item.id)
                        .value();
                });
            })
            .then(function(atpagesDataArray) {
                return Promise.map(atpagesDataArray, function(item) {
                    item = item.toObject();
                    item.rank_weight = _.chain(taggings)
                        .find({taggable_id: item.id})
                        .get('atpages_weight')
                        .value();
                    return item;
                });

             })
             .value();
        })       
    })
    .then(function(result){
        console.log(result);
        callback(null, result);
    })
    .catch(function(error){
        callback(error, null);
    })
}