我正在尝试使用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);
})
}
但是当我检查日志时,没有任何内容被打印出来,任何人都可以告诉我哪里出错了,还是有更好的方法?
答案 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);
})
}