2016-08-13 12 views
0

Open Weatherマップを使用して天気を検索しようとしています。私はfindWeatherByLocationfindWeatherByCityの2つの方法があります。私はJavaScriptmethod overloadingをサポートしておらず、したがって2つの異なる名前をサポートしていると仮定しています。どちらの方法も、callback関数を受け入れ、同じことを行います。JavaScriptでコードの重複を避けるには、添付のスニペットですか?

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)は両方の場所で同じことを行います。 findWeatherByCityfindWeatherByLocationの両方に共通の別のfunction(error, response, body)を作成すると、callbackはどのようにトリガーされますか?事前にあなたの助けのための

感謝。

+1

私はそれがこのdoesntのは見栄え偉大に関して –

答えて

0

さて、この質問が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) 
    }); 
} 
+0

をhttp://codereview.stackexchange.com/に属しているため、ErrorHandlerの成功を扱うオフトピックとして、この質問を閉じるために投票しています同じように??明らかにコードはこれ以上多くのリファクタリングすることができます... – Bamieh

+0

私はこの@AhmadBamiehをかなり理解していません。あなたの与えられたコードも失敗だけでなく成功も処理しています。 –

1

私はコールバックをリファクタリング、コードを整理するための約束を使用していたが、あなたがたがコールバックに置き換えることができます私はそれを推奨しません(すでに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); 
 
    });

関連する問題