繁体   English   中英

Javascript函数改变返回值

[英]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);
            }
        })
    })
}

看起来有很多问题:

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

  2. 您从forEach回调函数中解析承诺。 这意味着当第一项被完全处理时,结果将被返回。

您可以在此处使用传统的for循环,如评论中所述。 不利的一面是,产品将一个接一个地得到解决。 如果您想并行运行查询(查看您的代码可能是这种情况),您可以使用map而不是forEachPromise.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM