如果停止使用缩进一层额外的只是.then()
,那么你有一个非常简单的结构。
一个.then()
处理器包含 的if()
声明 包含一个for循环 包含另一个异步操作
在这个修改后的版本,有一半的缩进来自你if
和for
具有无关的承诺。其余的对我来说似乎很合乎逻辑,完全不像回拨地狱。这是实现你所显示的逻辑所需要的。
flipkart.getAllOffers = function() {
interval(43200,() => {
flipkart.findAllCategories().then((categories) => {
flipkart.save('flipkart_categories.json', categories)
if (categories) {
for (let item of categories) {
flipkart.findAllForCategory(item.category, item.top).then((items) => {
flipkart.save('flipkart_top_' + item.category + '.json', items)
}).catch((error) => {
console.log(error)
throw error; // don't eat error, rethrow it after logging
});
}
}
}).catch((error) => {
console.log(error)
})
})
}
如果flipkart.save()
也是异步,并返回一个承诺,那么你可能要挂钩到这些承诺过于链。
你总是可以创建一个可以改善一下也是这样的一个辅助功能:
flipkart.getAllOffers = function() {
interval(43200,() => {
flipkart.findAllCategories().then(iterateCategories).catch((error) => {
console.log(error);
})
})
}
function iterateCategories(categories) {
flipkart.save('flipkart_categories.json', categories);
if (categories) {
for (let item of categories) {
flipkart.findAllForCategory(item.category, item.top).then((items) => {
flipkart.save('flipkart_top_' + item.category + '.json', items);
}).catch((error) => {
console.log(error);
});
}
}
}
如果你想收集所有的结果(什么你的标题所暗示的,但你的问题没有按实际上不提),那么你可以这样做:
flipkart.getAllOffers = function() {
interval(43200,() => {
flipkart.findAllCategories().then(iterateCategories).then((results) => {
// all results here
}).catch((error) => {
console.log(error);
});
})
}
function iterateCategories(categories) {
flipkart.save('flipkart_categories.json', categories);
let promises = [];
if (categories) {
for (let item of categories) {
let p = flipkart.findAllForCategory(item.category, item.top).then((items) => {
flipkart.save('flipkart_top_' + item.category + '.json', items);
}).catch((error) => {
console.log(error);
});
promises.push(p);
}
}
// return promise here that collects all the other promises
return Promise.all(promises);
}
首先,你使用了比需要更多的缩进。通过将'.then()'处理程序放在另一个缩进级别,您将累积更多缩进量。这是一种个人风格的东西,但不是必需的,并且创建比简单阅读代码所需的更多缩进。 – jfriend00