UNPKG

search-destination-async

Version:

Search destinations by name, address, point of interest or coordinates. Using utility async.js

131 lines (111 loc) 2.81 kB
var _ = require('underscore'); var async = require('async'); var searcher = require('search-destination'); var config = require('../config.json'); const DEFAULT_CONCURRENCY_VALUE = 2; function Scheduler () {} /** * @access public */ Scheduler.prototype.runAsyncProcessSearch = function (data) { var tasks = this._prepareTasksForSearch( data.address ); this._getQueue(data.callbackOnFinish).push( tasks, data.callbackOnTask ); }; /** * @access public */ Scheduler.prototype.runAsyncProcessReverse = function (data) { var tasks = this._prepareTasksForReverse( data.latitude, data.longitude ); this._getQueue(data.callbackOnFinish).push( tasks, data.callbackOnTask ); }; /** * @access protected */ Scheduler.prototype._prepareTasksForSearch = function (address) { var tasks = _.map( this._getProviderList(), function (values) { return { search: true, // task for search by query (address) address: address, provider: values.name, options: values.options // default provider options for work with API }; }); return tasks; } /** * @access protected */ Scheduler.prototype._prepareTasksForReverse = function (lat, lng) { var tasks = _.map( this._getProviderList(), function (values) { return { reverse: true, // task for search by coordinates (latitude/longitude) latitude: lat, longitude: lng, provider: values.name, options: values.options // default provider options for work with API }; }); return tasks; } /** * @access protected */ Scheduler.prototype._getProviderList = function () { if (!this.providerList && ('provider' in config)) { this.providerList = _.filter(config.provider, function (values) { // use only active providers return (values.active == true); }); } return this.providerList; } /** * @access protected */ Scheduler.prototype._getQueue = function (callbackOnFinish) { queue = async.queue( this._getWorker(), this._getConcurrency() ); queue.drain = function() { if (_.isFunction(callbackOnFinish)) callbackOnFinish(); }; return queue; } /** * @access protected */ Scheduler.prototype._getWorker = function () { return function (task, callback) { searcher.useProvider(task.provider, task.options); // set options if ('search' in task) { searcher.search(task.address, callback); // set options } else if ('reverse' in task) { searcher.reverse(task.latitude, task.longitude, callback); // set options } else { callback(); } }; } /** * @access protected */ Scheduler.prototype._getConcurrency = function () { return config.concurrency || DEFAULT_CONCURRENCY_VALUE; } module.exports = Scheduler;