Возможная реализация на основе обещаний, позволяющая getAllProducts называть себя рекурсивно.
exports.findProduct = (ingredient, store) => {
return new Promise((resolve, reject) => {
products.getProductData(ingredient, store)
.then( data => products.getProducts(data))
.then( productList => products.filterProductData(productList))
.then( selectedProduct => resolve(selectedProduct))
.catch( err => reject(err))
}
}
function getAllProducts(ingredientList, shopName) {
const allProducts = [];
return new Promise((resolve, reject) => {
products.findProducts(ingredientList, shopName)
.then(product => {
allProducts.push(...product);
if(/*need more products*/) {
getAllProducts(ingredientList, 'Tesco')
.then(newProducts => {
allProducts.push(...newProducts);
resolve(allProducts);
})
.catch(err => reject(err));
} else {
resolve(allProducts);
}
})
.catch(err => reject(err));
}
}
Называется вот так ...
getAllProducts(ingredientList, 'Waitrose')
.then(products => {
res.send(products);
res.end();
}).catch(err => {
res.send(status.badRequest, {error: err.message});
res.end();
});
Редактировать:
Вышеупомянутый подход действителен, если вам нужно определить, следует ли делать больше вызовов на основе результата предыдущего вызова. Если вы знаете заранее, что вам нужно сделать несколько вызовов, например, если вы знаете, что хотите проверить Tesco, Waitrose и Asda, тогда есть более простой способ использования Promise.all
exports.findProduct = (ingredient, store) => {
return new Promise((resolve, reject) => {
products.getProductData(ingredient, store)
.then( data => products.getProducts(data))
.then( productList => products.filterProductData(productList))
.then( selectedProduct => resolve(selectedProduct))
.catch( err => reject(err))
}
}
function makeMultipleCalls() {
const stores = ['Waitrose', 'Tesco', 'Asda'];
const promises = [];
for (var store in stores) {
promises.push(product.findProduct(ingredientList, store);
}
Promise.all(promises)
.then(results => {
res.send(results.reduce((a,b) => a.concat(b)));
res.end();
})
.catch(err => {
//deal with error
});
}