当前位置: 首页 > 知识库问答 >
问题:

在异步中尝试捕获的问题等待

从渊
2023-03-14

我正在与async Wait try catch块斗争几天。

async function executeJob(job) {

  // necessary variable declaration code here

  try {
    do {
      let procedureRequests = await ProcedureRequestModel.find(filter, options);

      // doing process here...

    } while (fetchedCount < totalCount);

    providerNPIIds = [...providerNPIIds];

    // Fetch provider details
    let providerDetails = await esHelper.getProvidersById(providerNPIIds, true);

    try {

      let updateProviderCount = await UserProvider.updateAll(
          {
            userId: userId
          },
          {
            providers: providerNPIIds,
            countByType: providerCountType
          });

      if(updateProviderCount) {
        try {
          let destroyJobId = await  app.models.Job.destroyById(job.idd);
        } catch (e) {
          var err = new QueueError();
          console.log(err instanceof QueueError);
          throw new QueueError();
        }

      }
    } catch (e) {
      logger.error('Failed to update UserProviders  & Count: %O', err);
      throw e;
    }

    executeNextJob();
  } catch (e) {
    if(e instanceof QueueError) {
      console.log('Exiting from process');
      process.exit(1);
    } else {
      console.log('Working Code');
      buryFailedJobAndExecuteNext(job);
    }

  }
}

这个异步函数中的try-catch是否正确?

这就是我创建自定义错误类并全局导出的方式。

// error.js file

class QueueError extends Error {

}

global.QueueError = QueueError;

要求:

故意换了工作。我想找份工作。国际直拨电话

let destroyJobId = await  app.models.Job.destroyById(job.idd); 

这样我就能抓住错误。如果有错误,则抛出新创建的自定义错误类。但抛出队列错误将导致日志记录

logger.error('Failed to update UserProviders  & Count: %O', err); 

同样,即使不需要捕捉那个里的错误,因为try块在工作,若我抛出QueueError,我只想捕捉最后一个catch块中的错误。

下面是回调版本,我将其转换为异步等待。

 Updating providersNPIId & category count
     UserProvider.updateAll({userId: userId},
       {
         providers: providerNPIIds,
         countByType: providerCountType,
       }, function(err, data) {
         if (err) {
           logger.error('Failed to update UserProviders  & Count: %O', err);
           // throw new QueueError();
         }
         // Remove countProvider Job
         app.models.Job.destroyById(job.id, function(err) {
           if (err) {
             logger.error('Failed to remove countProvider job: %O', err);

           }
         });
       });

共有2个答案

法兴德
2023-03-14

这与您拥有的基本相同:

1 function myFunctionPromise() {                                                                                     
2   return new Promise((response, reject) => {                                                                       
3       setTimeout(() => reject("Reject Err"), 3000);                                                                
4   });                                                                                                              
5 } 

7 async function myFunction() {                                                                                      
8      try {                                                                                                         
9        try {                                                                                                       
10          await myFunctionPromise();                                                                                
11        } catch(e) {                                                                                                
12          console.log("Second Err");                                                                                
13          throw e;                                                                                                  
14        }
15 
16      } catch (e) {                                                                                                 
17        throw e;
18      }
19 
20      console.log("test");
21 }
22 
23 
24 myFunction()

我看到的唯一区别是拒绝了promise线3。所以我想知道:

app.models.Job.destroyById(job.idd)

这就是拒绝promise。

邓子濯
2023-03-14

您可以在较小的函数中重构代码,这些函数返回一个promise,您可以在本地包装try-catch并处理它。

async function executeJob(job) {

  // necessary variable declaration code here
  try {

    await doProcedure();

    providerNPIIds = [...providerNPIIds];

    // Fetch provider details
    let providerDetails = await esHelper.getProvidersById(providerNPIIds, true);
    const updateProviderCount = await getProviderCount(userId, providerNPIIds, providerCountType);

    if(updateProviderCount) {
        await destroyJobById(job.idd);
    }

    executeNextJob();
  } catch (e) {
    if(e instanceof QueueError) {
      console.log('Exiting from process');
      process.exit(1);
    } else {
      console.log('Working Code');
      buryFailedJobAndExecuteNext(job);
    }
  }
}

async function doProcedure() {
    try {
        do {
          let procedureRequests = await ProcedureRequestModel.find(filter, options);

          // doing process here...

        } while (fetchedCount < totalCount);
    } catch (err) {
        throw err;
    }
}

async function getProviderCount(userId, providerNPIIds, providerCountType) {
    try {
        let updateProviderCount = await UserProvider.updateAll({ userId: userId }, { providers: providerNPIIds, countByType: providerCountType });
        return updateProviderCount;
    } catch (err) {
      logger.error('Failed to update UserProviders  & Count: %O', err);
      throw e;
    }
}

async function destroyJobById(Id) {
    try {
          let destroyJobId = await app.models.Job.destroyById(Id);
    } catch (err) {
          throw err;
    }
}
 类似资料:
  • 我使用async、await编写了一个Javascript代码,并在每个异步函数中使用try、catch。 假设如果我写了10个异步函数,那么我需要在所有这10个函数中写try,catch。现在我脑子里有一个问题,那就是它不会造成性能开销吗?

  • 问题内容: 我正在研究节点7异步/等待功能,并不断跨这样的代码绊脚 这似乎是使用异步/等待解决/拒绝或返回/抛出的唯一可能性,但是,v8不会在try / catch块中优化代码吗? 有其他选择吗? 问题答案: 备择方案 替代方法: 显式地使用诺言将是这样的: 或类似的东西,使用延续传递样式: 原始例子 您的原始代码所做的是暂停执行并等待由其返回的诺言解决。然后,它继续执行,并将返回的值写入,如果承

  • 我有一种使用猫鼬将产品发布到mongodb的方法。我使用的是异步等待而不是当时的捕获块。我的代码 : 捕获中的错误由我的应用中的快速中间件捕获.js。 这工作正常。在这种特定情况下,当数组“标签”长于5时,我来自Postman(REST API开发工具)的请求返回: 当我尝试在尝试捕获之外使用“如果”检查时,我得到这个错误: 这种在try-catch中抛出错误以检查长度、使用if语句检查空数组的方

  • 我有以下代码。 然而,它没有捕捉到所有的错误,我仍然得到“throw er//未处理的“错误”事件。 这是为什么呢? 例如,直到我添加了一个特定的错误处理程序,它才捕获parse()函数中的错误。即使不添加,我的try/catch是否应该捕获此错误? 提前致谢!

  • 我在使用这个try/catk语句时遇到了麻烦。我试图用它抛出一条错误消息,上面写着,“请输入一个整数!”如果用户输入一个字母。我使用的第一个成功了,但是它最终需要两行用户输入,而不仅仅是一行,所以它基本上跳过了一个应该问的问题。在那之后,其他的都不起作用,它们只是被完全跳过。我还需要对用户输入做同样的事情,如果用户在字母应该在的地方输入整数,它会抛出一条错误消息,上面写着“请输入字符串!”。我知道

  • 问题内容: 我有一个while循环,应该捕获一个非整数输入,并要求用户重新输入一个整数。但是,它只是无限循环错误消息。有谁知道为什么不允许第二次扫描仪输入? 问题答案: 当您输入的令牌不是数字时,调用nextInt不会将扫描仪移到令牌之外。结果,它只是一遍又一遍地读取相同的令牌。 这是nextInt的文档:http : //download.oracle.com/javase/6/docs/api