如何避免附加代码段中 JavaScript 中的代码重复?
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)
在两个地方做同样的事情。如果我单独创建一个 findWeatherByCity
和 findWeatherByLocation
通用的 function(error, response, body)
,我该如何触发 callback
?
提前感谢您的帮助。
好吧,这个问题不属于 Whosebug,但您可以按照以下方法进行操作:
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)
});
}
我已经使用 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);
});
我正在尝试使用 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)
在两个地方做同样的事情。如果我单独创建一个 findWeatherByCity
和 findWeatherByLocation
通用的 function(error, response, body)
,我该如何触发 callback
?
提前感谢您的帮助。
好吧,这个问题不属于 Whosebug,但您可以按照以下方法进行操作:
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)
});
}
我已经使用 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);
});