gpt4 book ai didi

javascript - Node.js - 迭代运行带有回调的函数

转载 作者:行者123 更新时间:2023-12-03 05:29:27 25 4
gpt4 key购买 nike

我正在使用 node.js 在 javascript 中开发 API

我想做的是调用一个函数,该函数会触发一系列 promise ,并在回调时返回一个包含一个产品信息的数组。

我想要做的是根据需要多次运行此函数以形成 JSON 格式的产品列表。

但是这个产品列表需要在发送回用户之前创建,这就是我正在努力的地方。

这是我的功能:

exports.findProduct = (ingredient, store, callback) => {
products.getProductData(ingredient, store)
.then( data => products.getProducts(data))
.then( productList => products.filterProductData(productList))
.then( selectedProduct => callback(null,selectedProduct))//get individual products and add to list
.catch( err => callback(err))
}

我这样调用它

products.findProduct(ingredient, 'Waitrose', (err, data) => {

if (err) {
//res.send(status.badRequest, {error: err.message})
} else {
res.send(data)
res.end()
}

})

res.send(data) 将回调中的数据发送回服务器,但是如果我想再次运行此函数并更新数组,然后再将数组发送到服务器,该怎么办?服务器?

任何提示帮助将不胜感激。

最佳答案

基于 promise 的可能实现,允许 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
});
}

关于javascript - Node.js - 迭代运行带有回调的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41005836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com