如果停止使用縮進一層額外的只是.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