[英]How to avoid code duplication in JavaScript in the attached snippet?
我正在尝试使用Open Weather
地图查找天气,并且我有2种方法,即findWeatherByLocation
和findWeatherByCity
。 我假设JavaScript
不支持method overloading
,因此不支持2个不同的名称。 这两种方法均接受将被触发并执行相同操作的callback
函数。
function findWeatherForCity(senderID, city, countryCode, callback) {
//Lets configure and request
request({
url: constants.OPEN_WEATHER_MAP_BASE_URL, //URL to hit
qs: {
q: city + ',' + countryCode,
appid: constants.OPEN_WEATHER_MAP_API_KEY
}, //Query string data
method: 'GET', //Specify the method
}, function (error, response, body) {
if (!error && response.statusCode == 200) {
let weather = getWeatherReport(JSON.parse(body));
callback(weather ? weather : null);
}
else {
console.error(response.error);
callback(null);
}
});
}
/*
lat, lon coordinates of the location of your interest
* http://openweathermap.org/current
*/
function findWeatherForLocation(senderID, location, callback) {
//Lets configure and request
request({
url: constants.OPEN_WEATHER_MAP_BASE_URL, //URL to hit
qs: {
lat: location.lat,
lon: location.lon,
appid: constants.OPEN_WEATHER_MAP_API_KEY
}, //Query string data
method: 'GET', //Specify the method
}, function (error, response, body) {
if (!error && response.statusCode == 200) {
let report = getWeatherReport(JSON.parse(body));
callback(report ? report : null);
}
else {
console.error(response.error)
callback(null);
}
});
}
如您所见, function(error, response, body)
在两个地方都做同样的事情。 如果我创建了一个单独的function(error, response, body)
,这对于findWeatherByCity
和findWeatherByLocation
都是通用的,那么如何触发callback
?
感谢您的帮助。
我已经使用了promises来重构回调并整理代码,但是您可以用回调代替它们,尽管我不建议这样做(已经是2016年了)。
/* you are not using senderID anywhere but i left it cuz you had it.*/ function findWeather(senderID, queryType, options) { return new Promise(function(resolve, reject) { var queryObj = { appid: constants.OPEN_WEATHER_MAP_API_KEY }; if (queryType === 'city') { queryObj.q = options.city + ',' + options.countryCode; } else if (queryType === 'location') { queryObj.lat= options.lat; queryObj.lon= options.lon; } } else { reject('no valid queryType'); } request({ url: constants.OPEN_WEATHER_MAP_BASE_URL, qs: queryObj, method: 'GET' }, function(err, response, body) { if (!error && response.statusCode == 200) { let report = getWeatherReport(JSON.parse(body)); resolve(report ? report : null); } else { reject(response.error); } }); }); } /*USAGE*/ findWeather(1, 'city', { city: 'Ramallah', countryCode: '00970' }) .then(function(data) { console.log(data); }); findWeather(1, 'location', { lat: 1, lon: 2 }) .then(function(data) { console.log(data); }) .catch(function(err) { console.log(err); });
这个问题不属于StackOverflow,但是这是您可以执行的操作:
function responseHandler (error, response, body, callback) {
if (!error && response.statusCode == 200) {
let weather = getWeatherReport(JSON.parse(body));
callback(weather ? weather : null);
}
else {
console.error(response.error);
callback(null);
}
}
function findWeatherForCity(senderID, city, countryCode, callback) {
//Lets configure and request
request({
url: constants.OPEN_WEATHER_MAP_BASE_URL, //URL to hit
qs: {
q: city + ',' + countryCode,
appid: constants.OPEN_WEATHER_MAP_API_KEY
}, //Query string data
method: 'GET', //Specify the method
}, function(error, response, body) {
responseHandler(error, response, body, callback)
});
}
/*
lat, lon coordinates of the location of your interest
* http://openweathermap.org/current
*/
function findWeatherForLocation(senderID, location, callback) {
//Lets configure and request
request({
url: constants.OPEN_WEATHER_MAP_BASE_URL, //URL to hit
qs: {
lat: location.lat,
lon: location.lon,
appid: constants.OPEN_WEATHER_MAP_API_KEY
}, //Query string data
method: 'GET', //Specify the method
}, function(error, response, body) {
responseHandler(error, response, body, callback)
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.