web-dev-qa-db-ja.com

async / awaitのループバックサポート

_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().

どうしましたか?私はこの問題を乗り越えることができません。

7
khernik

いくつかのリファクタリング:

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}});
};
10
Maxim Sharai

私は単に2つの概念を混ぜ合わせていたようですが、これが解決策です。

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);
  }
};
1
khernik

より簡単な方法は、関数を使用してpromiseを解決し、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
hasnain haider