diff --git a/lib/egg.js b/lib/egg.js index beaba50b..a32fa55a 100644 --- a/lib/egg.js +++ b/lib/egg.js @@ -119,11 +119,19 @@ class EggCore extends KoaApplication { /** * close all listeners * @member {Function} + * @return {Promise} promise * @since 1.0.0 */ close() { - this.emit('close'); - this.removeAllListeners(); + return new Promise((resolve, reject) => { + try { + this.emit('close'); + this.removeAllListeners(); + resolve(); + } catch (err) { + reject(err); + } + }); } /** diff --git a/test/egg.test.js b/test/egg.test.js index f17a24da..bbb6a573 100644 --- a/test/egg.test.js +++ b/test/egg.test.js @@ -146,7 +146,6 @@ describe('test/egg.test.js', () => { describe('app.close()', () => { let app; - afterEach(() => app.close()); it('should emit close event before exit', () => { app = utils.createApp('close'); @@ -157,5 +156,24 @@ describe('test/egg.test.js', () => { app.close(); called.should.equal(true); }); + + it('should return a promise', done => { + app = utils.createApp('close'); + const promise = app.close(); + promise.should.instanceof(Promise); + promise.then(done); + }); + + it('should throw when close error', done => { + app = utils.createApp('close'); + mm(app, 'removeAllListeners', () => { + throw new Error('removeAllListeners error'); + }); + app.close().catch(err => { + err.message.should.eql('removeAllListeners error'); + done(); + }); + }); }); + });