В последнее время я работал над довольно большим количеством асинхронных Javascript и почувствовал необходимость поработать еще немного над промисами и другими структурами потоков в node.

Что мы собираемся сделать сегодня, я создам небольшое терминальное приложение, чтобы получать информацию о погоде для вас, поскольку я притворяюсь серфером, который много использует cli.

Предположения

  • Знакомство с базовым Javascript
  • Интерес к es6/es2015

Хорошо пойдем;

Я. Сначала давайте создадим файл ввода с именем app.js и два других файла location.js , weather.js, которые мы будем использовать позже, чтобы выполнить фактическую работу по выборке нашего местоположения и погоды.

II. Давайте начнем с определения местоположения пользователя (позже мы можем использовать GPS, но давайте пока используем топоним, например, Париж, Нью-Йорк, Найроби). Добавьте следующее в location.js;

//guestimate the users location
var url = 'http://ipinfo.io/';
var request = require('request');
module.exports =  () => {
  return new Promise((resolve, reject) => {
    //lets use request to fetch  a guestimate of the location using ip
    request({url: url, json: true}, (error, response, body ) =>{
      if(error) {
        reject(`${error.message} occured`)
      } else {
        //lets resolve our promise with the data
        resolve(body);
      }
    });
  });
}

Что здесь происходит, так это то, что мы делаем новое обещание, которое извлекает содержимое ipinfo для информации о нашем местоположении, и в случае возникновения ошибки оно будет reject с этой ошибкой или resolve с нашими требуемыми данными. Для целей этого примера мы будем использовать request для получения наших данных URL, не стесняйтесь использовать другие методы здесь AJAX, axios, fetch, может быть, даже обещание!

III. Теперь давайте получим погоду, так как у нас есть местоположение пользователя. В weather.js давайте добавим вызов openweathermap для получения текущей погоды в найденном месте. Давайте определим обещание получить погоду: имя, погода, максимум и минимум — это значения из json, которые мы получаем из openweathermap.

const weatherGetter =  () => {
    return new Promise(function(resolve, reject) {
       request({url: cityUrl, json: true}, function(error, response, body ) {
       if(error) {
         reject(`error.message, occured`)
       } else {
         const name  = body.name;
         const weather = body.weather[0].main;
         const high = body.main.temp_max;
         const low = body.main.temp_min;
         //console.log(JSON.stringify(body, null, 4))
         resolve(`${name} weather today is ${weather} with highs of ${high} celcius and lows of ${low} celcius`)
       }
     });
    });

  }

IV. Чтобы связать все это вместе, мы можем добавить еще немного кода в weather.js, посмотрите полный пример здесь weather.js

if(location.length > 0) {
  console.log(`Checking Weather for ${location} >>>`);
  city = location
  cityUrl = `${unitUrl}&q=${city}`;
  weatherGetter();
} else {
  console.log('Finding Location >>')
  //lets call location
  loc().then((data) => {
    console.log(`Checking Weather for ${data.city} >>>`);
    city = data.city;
    cityUrl = `${unitUrl}&q=${city}`;
    weatherGetter().then((data) => {
      console.log(data);
    })
  }, (locationErr) => {
    //incase our promise rejects
    console.log(`Error ${locationErr} occured`)
  })
}

В. Наконец давайте добавим немного пустыни! Давайте включим возможность app.js для моих разрешенных cli опций, для этого мы будем использовать yargs

var weather = require('./weather.js')
//set up arguments we want
var argv =  require('yargs')
  .command('get', 'get the weather', (yargs) => {
    yargs.options ({
      location: {
        alias: 'l',
        description: 'provide your current location e.g Paris, Nairobi',
        type: 'string'
      }
    })
    .help('help') //enable --help
  })
  .help('help')
  .argv;
var command= argv._[0];

if(command === 'get') {
  weather(argv.location)
}

Здесь мы видим, что мы используем пакет yargs, чтобы разрешить флаг командной строки get и что он принимает имя вашего текущего местоположения, затем мы приступаем к импорту погоды и находим погоду из него, чтобы увидеть, как весь код, работающий вместе, принимает смотри здесь приложение

По любым вопросам или предложениям добавляйте вопросы или твитните меня!

Вернуться к коду 😝

Первоначально опубликовано наhttps://zacck.github.io/node/2017/03/28/Send-Promises-for-Weather.html