【问题标题】:Why redefining the variable not throwing the error in async function为什么重新定义变量不会在异步函数中引发错误
【发布时间】:2019-08-16 19:52:49
【问题描述】:

我的 nodejs 中有以下代码。在这里,我将screenshot 定义为const,然后重新定义它,如下所示。这里的问题是我的代码既没有抛出任何错误,也没有在控制台console.log('opopopopopoopoooooopop') 之后进一步执行。一段时间后,我发现原因是“我已将 `screenshot variable as const”。

const handler = async(request, reply) => {
  try {
    const screenshotPath = ''
    console.log(request.payload, 'ddddddddddddddddddd')
    let folderName = `./public/applications/${applicationId}`
    let filepath = `${folderName}/${className}.png`
    mkdirp(folderName, async(err) => {
      await imageUpload(file, className, filepath)
      console.log('oooooooooooooooooooo')
      if (err) {
        return reply({ success: false, message: err.message, data: null })
      }
      console.log('opopopopopoopoooooopop')
      screenshotPath = filepath
      console.log(Event)
      const screen = await Event.findOne({ })
      console.log(screen, 'popopopopopoopopooop')
    })
  } catch (err) {
    console.log({ err })
    return reply({ success: false, message: err.message, data: null })
  }
}

但问题是为什么我的代码没有在这里抛出错误。有人可以帮助我理解这一点。

谢谢!!!

【问题讨论】:

  • 您是否尝试在内部异步函数中添加 try-catch 块?
  • @JamesDeSouza no...单次尝试捕获不能做到这一点吗?
  • 显然不是!当您运行异步方法时,它就像另一个线程一样工作。不是什么好东西。
  • @JamesDeSouza 那么有没有办法处理单个 catch 块?

标签: javascript node.js asynchronous async-await


【解决方案1】:

async 函数中的错误导致返回的Promise 被拒绝。

...但是如果没有使用 Promise:

const handler = async () => {
  try {
    const screenshotPath = '';
    const callback = async () => {
      screenshotPath = 'redefined'; 
    }
    const promise = callback();  // <= promise will reject...
  } catch (err) {
    console.log('in catch');  // ...but this never runs
  }
  console.log('finished');
}

handler();

...然后什么都没有发生。

这称为未处理的承诺拒绝


另一方面,如果相同的Promiseawait-ed,那么将调用catch:

const handler = async () => {
  try {
    const screenshotPath = '';
    const callback = async () => {
      screenshotPath = 'redefined'; 
    }
    await callback();
  } catch (err) {
    console.log('in catch');  // this runs!
  }
  console.log('finished');
}

handler();

因此,由于错误发生在 async 回调中,因此它返回的 Promise 将被拒绝,但由于没有使用被拒绝的 Promise,因此没有任何反应。


解决方案

看起来您的mkdirp 函数如下...

常见的错误优先回调样式,即将(err, value) =&gt; ... 回调作为最后一个参数

...所以您可以使用 Node 的 util.promisify 创建一个返回 Promisemkdirp 版本:

const util = require('util');
const mkdirpPromisified = util.promisify(mkdirp);

const handler = async(request, reply) => {
  try {
    let screenshotPath = ''
    let folderName = `./public/applications/${applicationId}`
    let filepath = `${folderName}/${className}.png`
    await mkdirpPromisified(folderName)
    await imageUpload(file, className, filepath)
    if (err) {
      return reply({ success: false, message: err.message, data: null })
    }
    screenshotPath = filepath
    const screen = await Event.findOne({ })
  } catch (err) {
    console.log({ err })
    return reply({ success: false, message: err.message, data: null })
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 2017-12-08
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多