diff --git a/blocks/sg-datalist/sg-datalist.js b/blocks/sg-datalist/sg-datalist.js index b7e0065..0b41e13 100644 --- a/blocks/sg-datalist/sg-datalist.js +++ b/blocks/sg-datalist/sg-datalist.js @@ -38,13 +38,13 @@ provide(BemDom.decl(this.name, { throw new Error('dataprovider can\'t be set twice'); } this._dataprovider = dataprovider.on({ - 'items' : this._onProviderGotItems, + 'data' : this._onProviderGotData, 'error' : this._onProviderGotError }, this); }, requestData : function(params) { - this.getDataProvider().get(params); + this.getDataProvider().get(params).done(); return this; }, @@ -110,10 +110,10 @@ provide(BemDom.decl(this.name, { this.emit('item-click', data); }, - _onProviderGotItems : function(e, data) { + _onProviderGotData : function(e, data) { this .emit('items', data) - ._updateMenu(data.items); + ._updateMenu(data.result); }, _onProviderGotError : function(e, data) { diff --git a/blocks/sg-dataprovider/sg-dataprovider.deps.js b/blocks/sg-dataprovider/sg-dataprovider.deps.js index 49e5c5c..9011ba3 100644 --- a/blocks/sg-dataprovider/sg-dataprovider.deps.js +++ b/blocks/sg-dataprovider/sg-dataprovider.deps.js @@ -2,6 +2,6 @@ shouldDeps : [ 'inherit', 'events', - 'next-tick' + 'vow' ] }) diff --git a/blocks/sg-dataprovider/sg-dataprovider.js b/blocks/sg-dataprovider/sg-dataprovider.js index 45e6243..1135286 100644 --- a/blocks/sg-dataprovider/sg-dataprovider.js +++ b/blocks/sg-dataprovider/sg-dataprovider.js @@ -2,39 +2,33 @@ modules.define( 'sg-dataprovider', - ['inherit', 'events', 'next-tick'], - function(provide, inherit, events, nextTick) { + ['inherit', 'events', 'vow'], + function(provide, inherit, events, vow) { provide(/** @exports */ inherit(events.Emitter, { - __constructor : function() { - this.__base.apply(this, arguments); - this._onGotData = this._onGotData.bind(this); - }, - /** * @param {Object} params - * @returns {Object} this + * @returns {vow.Promise} */ get : function(params) { - // TODO: return Promise - this._getData(params, this._onGotData); - return this; + return vow.fulfill(this._getData(params)).always(this._onGotData, this); }, /** * @param {Object} params - * @param {Function} callback + * @returns {vow.Promise} * @abstract */ - _getData : function(params, callback) { - callback(new Error('not implemented')); + _getData : function(params) { + return vow.reject(new Error('not implemented')); }, - _onGotData : function(err, data) { - var _this = this; - nextTick(function() { - err ? _this.emit('error', err) : _this.emit('items', { items : data }); - }) + _onGotData : function(promise) { + var res = promise.valueOf(); + promise.isRejected()? + this.emit('error', res) : + this.emit('data', { result : res }); + return promise; } })); diff --git a/blocks/suggest/suggest.tests/simple.blocks/timezone-provider/timezone-provider.deps.js b/blocks/suggest/suggest.tests/simple.blocks/timezone-provider/timezone-provider.deps.js index fd7ca6b..e7d80a6 100644 --- a/blocks/suggest/suggest.tests/simple.blocks/timezone-provider/timezone-provider.deps.js +++ b/blocks/suggest/suggest.tests/simple.blocks/timezone-provider/timezone-provider.deps.js @@ -2,6 +2,7 @@ shouldDeps : [ { elem : 'storage' }, 'inherit', + 'vow', 'sg-dataprovider' ] }) diff --git a/blocks/suggest/suggest.tests/simple.blocks/timezone-provider/timezone-provider.js b/blocks/suggest/suggest.tests/simple.blocks/timezone-provider/timezone-provider.js index 076ee9d..5e6ed7f 100644 --- a/blocks/suggest/suggest.tests/simple.blocks/timezone-provider/timezone-provider.js +++ b/blocks/suggest/suggest.tests/simple.blocks/timezone-provider/timezone-provider.js @@ -1,7 +1,7 @@ modules.define( 'timezone-provider', - ['inherit', 'sg-dataprovider', 'timezone-provider__storage'], - function(provide, inherit, DataProvider, TzStorage) { + ['inherit', 'vow', 'sg-dataprovider', 'timezone-provider__storage'], + function(provide, inherit, vow, DataProvider, TzStorage) { provide(inherit(DataProvider, { __constructor : function(data) { @@ -10,13 +10,19 @@ provide(inherit(DataProvider, { }, /** @override */ - _getData : function(params, callback) { - var _this = this, - query = this._buildQuery(params.val); + _getData : function(params) { + var query = this._buildQuery(params.val), + deferred = vow.defer(); if(query) { - this._storage.find(query, callback); + this._storage.find(query, function(err, data) { + err? deferred.reject(err) : deferred.resolve(data); + }); + } else { + deferred.resolve([]); } + + return deferred.promise(); }, _buildQuery : function(val) {