[英]Javascript function changing return value
我的 Node.js 程序中有一个函数,它接收一个产品 ID 数组,然后遍历它们以在 mongo 中找到对象,最后如果找到的对象不在要返回的数组中,我将对象推入其中。 我正在使用 promise 来更好地处理异步调用。
问题是它有时会返回两个值,而有时它只为相同的输入返回一个值。 我不明白为什么会这样。 我假设是由于异步。 预先感谢您的帮助。
这是功能。
var productsToReturn = [];
return new Promise((resolve , reject)=>{
products.forEach(async (element, index)=>{
var product = await Product.findOne({_id: element.productId}).exec();
var indexOfArray = productsToReturn.findIndex(j=>JSON.stringify(j._id) ==JSON.stringify(product._id));
if(indexOfArray === -1) productsToReturn.push(product);
if(index -products.length === -1){
resolve(productsToReturn);
}
})
})
}
看起来有很多问题:
您为 forEach 使用异步回调并操作来自父作用域的变量: productsToReturn
。 执行顺序取决于Product.findOne
返回的速度,因此是不确定的。
您从forEach
回调函数中解析承诺。 这意味着当第一项被完全处理时,结果将被返回。
您可以在此处使用传统的for
循环,如评论中所述。 不利的一面是,产品将一个接一个地得到解决。 如果您想并行运行查询(查看您的代码可能是这种情况),您可以使用map
而不是forEach
和Promise.all
来确保一切Promise.all
完成。
代码看起来像这样:
return Promise.all(
products.map(async (element) =>
Product.findOne({ _id: element.productId }).exec()
)
);
如果您的产品数组中确实有重复的 id,您可能需要预先过滤它们以减少所需的查询量。 我不确定是否是这种情况,或者是否在处理非确定性返回值问题时刚刚引入了以下行:
var indexOfArray = productsToReturn.findIndex(j=>JSON.stringify(j._id) ==JSON.stringify(product._id))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.