Javascript函数改变返回值



我在我的Node.js程序中有一个函数,它接收产品id数组,然后迭代它们以查找mongo中的对象,最后如果找到的对象不在要返回的数组中,我将对象推入其中。我正在使用一个更好地处理异步调用的承诺。

问题是,对于相同的输入,它有时返回两个值,而有时只返回一个值。我不明白为什么会这样。我想是由于异步。提前感谢你的帮助。

函数如下:

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);
}
})
})
}

看起来有很多问题:

  1. 您使用forEach的异步回调并操作父作用域的变量:productsToReturn。执行顺序取决于Product.findOne的返回速度,因此是不确定的。

  2. forEach回调函数内部解析承诺。这意味着当第一项处理完成后,返回结果。

您可以像评论中讨论的那样在这里使用传统的for循环。缺点是,产品将一个接一个地解决。如果你想并行运行你的查询(这可能是看你的代码的情况),你可以使用map而不是forEachPromise.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))

最新更新