【问题标题】:How to use try, catch using async function with IIFE如何在 IIFE 中使用 try、catch 使用异步函数
【发布时间】:2020-01-18 02:03:24
【问题描述】:

我在 IIFE 中使用async 函数。
但是当我通过 rest api 调用运行这段代码时,
它说

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。

我在“for循环”中创建了trycatch
在这种情况下,我怎样才能做出正确的尝试捕获?

(async () => {
        for (let i = 0; i < keywordResult.places.length; i += 1) {
          try {
            const transformKeywordResult = await rp({
              method: 'GET',
              uri:
                '',
              qs: {
                query: query
              },
              json: true
            });

            let addrInfo = transformKeywordResult.addresses[i];
            if (!addrInfo.addressElements[8].longName) {
              addrInfo.addressElements[8].longName = '';
            }

            searchResult.push(transformKeywordResult);
          } catch (error) {
            return res.status(200).json({
              success: false,
              code: 500,
              msg: 'Internal Server Error',
              err: error,
              pos: 0
            });
          }
        }

        return res.send(searchResult);
      })();

【问题讨论】:

  • 该代码到底抛出了什么? await 应该被正确捕获
  • 您的查询在每次循环迭代中都是相同的。为什么不抓取一次并迭代数据呢?

标签: javascript node.js


【解决方案1】:

尝试关闭 try 块中的 for 循环,因为如果在 try 块之外发生任何错误,则没有 catch 块来保存错误。

( async () => {

    try {
        for ( let i = 0; i < keywordResult.places.length; i += 1 ) {
            const transformKeywordResult = await rp( {
                method: 'GET',
                uri: '',
                qs: {
                    query: query
                },
                json: true
            } );

            let addrInfo = transformKeywordResult.addresses[ i ];
            if ( !addrInfo.addressElements[ 8 ].longName ) {
                addrInfo.addressElements[ 8 ].longName = '';
            }
            searchResult.push( transformKeywordResult );
        }
        return res.send( searchResult );
    } catch ( error ) {
        return res.status( 200 ).json( {
            success: false,
            code: 500,
            msg: 'Internal Server Error',
            err: error,
            pos: 0
        } );
    }

} )();

【讨论】:

    【解决方案2】:

    您的rps 被正确捕获,但还有一个没有明显错误捕获的承诺,那就是您的 IIFE:

    (async () => {
    // do some stuff, including async
    )();
    

    顺便说一句,它可以抛出自己的错误(独立于异步 API 错误),例如当 addrInfo.addressElements 的长度小于 9 个元素时。

    试试

    (async () => {
    // do some stuff, including async
    )().catch(/* throw some error logic handling here, or even just noop */);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-02
      • 2011-09-16
      • 1970-01-01
      • 2020-01-21
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      相关资源
      最近更新 更多