Поддержка обратной связи для async / await - PullRequest
0 голосов
/ 01 мая 2018

Я использую loopback 3 для создания службы REST и хочу использовать async / await вместо использования обратных вызовов. Поэтому вместо этого:

MyModel.myFunction = (callback) => {
  MyModel.find({where: {id: 2}}, (e, data) => {
    if (e) return callback(e);
    callback(null, data);
  });
};

Я бы предпочел сделать:

MyModel.myFunction = async (callback) => {
  try {
    const data = await MyModel.find({where: {id: 2}});
    callback(null, data);
  } catch (e) {
    console.error(e);
    callback(e);
  }
};

Подход обратного вызова работает отлично - async / await, однако, выдает множество ошибок:

  • UnhandledPromiseRejectionWarning: Error: Callback was already called.
  • UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().

Что не так? Я не могу решить эту проблему.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Некоторые рефакторинг:

MyModel.myFunction = async () => {
  try {
    const data = await MyModel.find({where: {id: 2}});
    return data; // it's enough as the async means it returns a promise
  } catch (e) {
    console.error(e);
    throw e;
  }
};

Это на тот случай, если вам не нужно регистрировать ошибку (зацикливается обработчик ошибок вместо вас):

MyModel.myFunction = async () => {
  return MyModel.find({where: {id: 2}});
};
0 голосов
/ 16 ноября 2018

Более простым способом было бы просто использовать функцию для разрешения вашего обещания и просто передать ему запрос db, вот так.

async function ReturnWithResolvedPromise(dbQuery) {
try {
    return Promise.resolve(dbQuery);
} catch (e) {
    return Promise.reject(e);
}}

, а затем назовите это так

let result =    await ReturnWithResolvedPromise(await Users.count({where: {Region: 'UK'}}));
0 голосов
/ 01 мая 2018

Похоже, я просто смешал два понятия, вот решение:

MyModel.myFunction = async (callback) => {
  try {
    const data = await MyModel.find({where: {id: 2}});
    return Promise.resolve(data);
  } catch (e) {
    console.error(e);
    return Promise.reject(e);
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...