Правильный способ вызвать асинхронную функцию main? - PullRequest
1 голос
/ 05 апреля 2019

У меня есть несколько сценариев nodejs - т.е. процессы, которые выполняют работу и выполняют ее, а не работают непрерывно.

Я использую асинхронные функции, например:

const mysql = require('mysql2/promise');
...

async function main() {
    var conn = await mysql.createConnection(config.mysql);
    ...
    var [response, error] = await conn.execute(`
        DELETE something
        FROM some_table
        WHERE field = ?
    `, [value]);
    ...

Является ли следующий код:

main().then(() => process.exit(0)).catch(err => { console.error(err); process.exit(1); });

лучший / правильный способ начать выполнение асинхронного кода?

(Это работает, но я хочу убедиться, что я не оставляю дыр, которые могут вызватьсюрпризы, такие как исключения, которые молча проглатывают.)

Почему conn.execute() возвращает error (который мне нужно проверить вручную), а не выбрасывает одно?

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Использование then вместе с async..await необязательно, поскольку это синтаксический сахар для then.

Точка входа может быть async IIFE (IIAFE):

(async () => {
  try {
    var conn = await mysql.createConnection(config.mysql);
    ...
    var [response] = await conn.execute(`
        SELECT something
        FROM some_table
        WHERE field = ?
    `, [value]);
    ...
    process.exit(0);
  } catch (err) {
    console.error(err);
    process.exit(1);
  }
})();

Также может не потребоваться process.exit(0), если соединение было закрыто.

Почему conn.execute () возвращает ошибку (которую мне нужно проверить вручную), а не выбрасываетone?

В функциях с поддержкой обещаний нет и не принято возвращать ошибку в результате.

Основывается на обратном вызове execute используетобратный вызов с ошибкой для ошибок.Основанный на обещаниях execute не может выдать ошибку, потому что он возвращает обещание, которое отклоняется в случае ошибки.

Как показывает документация , второй элемент - fields ине error:

const [rows, fields] = await conn.execute('select ?+? as sum', [2, 2]);

Может возвращать отклоненное обещание, которое может быть перехвачено функцией try..catch внутри async в случае ошибки.

0 голосов
/ 05 апреля 2019

Объявление асинхронной функции определяет асинхронную функцию, которая возвращает объект AsyncFunction. Асинхронная функция - это функция, которая работает асинхронно через цикл обработки событий, используя неявное Promise для возврата своего результата. Но синтаксис и структура вашего кода с использованием асинхронных функций намного больше похожи на использование стандартных синхронных функций.

Вы также можете определить асинхронные функции, используя выражение асинхронной функции.

async function f() {

  try {
    let response = await fetch('http://no-such-url');
  } catch(err) {
    alert(err); // TypeError: failed to fetch
  }
}

f();

Вы также можете немедленно вызвать асинхронную функцию, используя следующий синтаксис

(async () => {

})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...