蓝鸟,茉莉花和asynchronousfunction未处理的拒绝错误

考虑以下(人为的)例子:

import Promise from 'bluebird'; const resolvedPromise = () => { return Promise.resolve('Test'); }; const asyncFunc = async (asyncResource) => { await resolvedPromise(); await asyncResource.fetchItem(); }; describe('async/await', () => { it('should throw an error', (done) => { const mockAsyncResource = jasmine.createSpyObj('mockAsyncResource', ['fetchItem']); const mockError = Promise.reject(new Error('HTTP 401 - Access Denied')); mockAsyncResource.fetchItem.and.returnValue(mockError); return asyncFunc(mockAsyncResource).catch(err => { expect(err.message).toEqual('HTTP 401 - Access Denied'); done(); }); }); }); 

我收到以下输出:

 1) async/await Unhandled rejection Error: HTTP 401 - Access Denied ... (error stack trace) ✔ should throw an error 

规范通过,但蓝鸟抱怨未处理的拒绝错误。

由于mockError的阻塞性质, mockError报告在第二个await有没有机会调用(并处理) mockError承诺之前,它是未处理的拒绝?

处理这种情况的最佳方法是什么? 我发现了promise.suppressUnhandledRejections() ,它是如此简单吗?

我认为这是一个混合两种不同types的承诺引起的问题。 您正在使用蓝鸟的Promise创build您已解决/拒绝的模拟诺言,但await会返回原生Promise

如果您在Chrome控制台上尝试以下操作,则只会使用原生承诺,您将看到它按预期工作:

 let resolvedPromise = () => { return Promise.resolve('Test'); }; let asyncFunc = async (asyncResource) => { await resolvedPromise(); await asyncResource.fetchItem(); }; let mockAsyncResource = {fetchItem: () => Promise.reject(new Error("foo"))}; asyncFunc(mockAsyncResource).catch((e) => console.log('handled')) 

如果你想坚持创build蓝鸟承诺,你可能需要用蓝鸟的Promise.try包装你的asynchronous函数,虽然我还没有能够testing这个:

 let asyncFunc = async (asyncResource) => { return Promise.try(async () => { await resolvedPromise(); await asyncResource.fetchItem(); }); };