Как использовать assert в асинхронных функциях? (Машинопись)

У меня есть блок, как показано ниже, который представляет собой функцию, использующую async. Если я добавлю туда оператор assert, он остановит выполнение кода в этой строке, но ошибка не будет выдана. Он просто тихо умирает :(

async function testMongo() {
  let db = await dbConnect();

  await db.collection("stories").remove({});
  let c = await count("stories", {} );
  assert.strictEqual(c, 999);   // should fail
  console.log("moving on...");  /// will never get reached.

}

Есть ли какая-то причина, по которой утверждение может быть проглочено? У меня уже были подобные проблемы с ошибками внутри эмиттеров событий, и кажется, что немедленный возврат асинхронной функции является каким-то типом эмиттера/обещания событий.


person dcsan    schedule 02.03.2016    source источник


Ответы (1)


Вызов console.log() можно пропустить, если async db.connection() или count() отклонят свои обещания. В этом случае вы должны попытаться обернуть эти вызовы в try/catch:

try
{
    await db.collection("stories").remove({});
}
catch(e)
{
    //...    
}

Или поймать ошибку, используя обещание:

await db.collection("stories").remove({}).catch((e) => {//...});

[РЕДАКТИРОВАТЬ]

Общая оболочка, которая будет выполнять асинхронную функцию и продолжать работу даже при отклонении, может выглядеть примерно так:

async function Do<T>(func: ()=>Promise<T>)
{
    try
    {
        await func();
    }
    catch(e)
    {
        console.log(e);  
    }
}
person Amid    schedule 02.03.2016
comment
интересно, есть ли способ вставить это в общую оболочку для всех функций awaited? - person dcsan; 02.03.2016