每个循环中有多个猫鼬调用

丹尼尔

我正在读取JSON对象并遍历每个项目。我首先要检查数据库中是否已经存在该项目,如果有,我想记录一条消息。如果尚不存在,我想添加它。

这可以正常工作,但是我想添加一个回调或使用process.exit()完成该过程;

因为猫鼬调用是异步的,所以我不能将其放在for循环的末尾,因为它们尚未完成。

我应如何处理此问题的最佳方法是什么?

function storeBeer(data) {
    data.forEach((beer) => {
        let beerModel = new Beer({
            beer_id: beer.id,
            name: beer.name,
            image_url: beer.image_url
        });
        Beer.findOne({
            'name': beer.name
        }).then(function (result) {
            if (result) {
                console.log(`Duplicate ${result.name}`)
            } else {
                beerModel.save(function (err, result) {
                    console.log(`Saved: ${result.name}`)
                });
            }
        });
    });
}

有什么我应该读的书来帮助解决这个问题吗?

杰克明戈

管理异步资源的一种方法是通过Promise对象,这些对象是Javascript中的一流对象。这意味着它们可以组织成数组,并且可以像其他任何对象一样进行操作。因此,假设您想像问题所暗示的那样并行存储这些啤酒,则可以执行以下操作:

function storeBeer(data) {
    // This creates an array of Promise objects, which can be
    // executed in parallel.
    const promises = data.map((beer) => {
        let beerModel = new Beer({
            beer_id: beer.id,
            name: beer.name,
            image_url: beer.image_url
        });

        return Beer.findOne({
              'name': beer.name
          }).then(function (result) {
              if (result) {
                  console.log(`Duplicate ${result.name}`)
              } else {
                  beerModel.save(function (err, result) {
                      console.log(`Saved: ${result.name}`)
                  });
              }
          });
        );
    });

    return Promise.all(promises);
}

不要忘记该storeBeer函数现在是异步的,将需要通过Promise链或通过来使用async/await

例如,要随后添加进程出口:

async function main() {
  const beers = [ ... ];
  await storeBeer(beer);
  process.exit(0);
}

您还可以修改上面的示例,以调用块中storeBeer函数try / catch,并根据抛出的任何错误以不同的错误代码退出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章