Почему переопределение переменной не выдает ошибку в асинхронной функции - PullRequest
1 голос
/ 26 марта 2019

У меня есть фрагмент кода в моем nodejs.Здесь я определил screenshot как const, а затем переопределил его, как вы можете видеть ниже.Здесь проблема в том, что мой код не выдавал никаких ошибок и не выполнялся дальше после консоли console.log('opopopopopoopoooooopop').Через некоторое время я выяснил причину: «Я взял переменную screenshot как 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 })
  }
}

Но проблема в том, почему мой код не выдает здесь ошибку.Может кто-нибудь, пожалуйста, помогите мне понять это.

Спасибо !!!

1 Ответ

1 голос
/ 26 марта 2019

Ошибка в функции 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();

... тогда ничего не происходит.

Это называется отклонением необработанного обещания .


С другой стороны, если тот же Promise является await -едом, то улов будет вызываться:

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) => ... в качестве последнего аргумента

... так что вы можете использовать Node's util.promisify для создания версии mkdirp, которая возвращает Promise:

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 })
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...