繁体   English   中英

如何避免所附代码段中JavaScript中的代码重复?

[英]How to avoid code duplication in JavaScript in the attached snippet?

我正在尝试使用Open Weather地图查找天气,并且我有2种方法,即findWeatherByLocationfindWeatherByCity 我假设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) ,这对于findWeatherByCityfindWeatherByLocation都是通用的,那么如何触发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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM