Вы разработчик и ищете новое хобби, совместимое с укрытием на месте? Хотели бы вы иметь возможность поделиться им с друзьями с безопасного для вирусов расстояния?

Вы можете наблюдать за звездами, находясь в безопасности на собственной лужайке, балконе или крыше, и вам не потребуется никакого оборудования, кроме собственных глаз и, возможно, бинокля. На ночном небе много ярких объектов, видимых невооруженным глазом. Одним из них является Международная космическая станция (МКС), которая является третьим по яркости объектом на небе после Солнца и Луны.

МКС вращается вокруг Земли со скоростью 27 576 километров в час (17 000 миль в час), совершая полный оборот за 94 минуты. Возможности наблюдать за ней длятся всего несколько минут, поэтому полезно знать, когда МКС будет видна и с какого направления она появится.

Вы можете создать для этого приложение и оттачивать свои навыки программирования, занимаясь своими астрономическими приключениями. Используя JavaScript, Node.js и RxJS Observables, вы можете написать программу, которая сообщит вам и вашим друзьям, когда ISS будет наверху. С Twilio Programmable SMS ваше приложение может своевременно уведомлять вашу команду по наблюдению за звездами с помощью текстовых сообщений.

Понимание учебного проекта

В этом руководстве показано, как создать программу, которая отправляет SMS-сообщения людям, когда МКС приближается к их географическому местоположению. Приложение будет использовать информацию из двух источников:

  • http://api.open-notify.org/iss-now.json, REST API, который предоставляет координаты для ISS в момент вызова API
  • stargazers.json,файл JSON, который вы создадите, чтобы содержать список людей, которые будут получать уведомления, включая их номера телефонов и географические координаты.

Вы будете использовать API Twilio Programmable SMS для отправки SMS-уведомлений. Twilio предоставляет вспомогательную библиотеку Node.js, упрощающую взаимодействие с API-интерфейсами Twilio, поэтому вы включите ее в свою программу JavaScript.

Этот туториал покажет вам ряд аспектов Observables RxJS для JavaScript. Вы будете использовать оболочку RxJS с вспомогательной библиотекой Twilio Node.js. Вы увидите, как использовать операторы RxJS map, distinctUntilChanged, filter, takeUntil, skip и flatMap. Вы также узнаете о различиях между реализациями Subject и ReplaySubject интерфейса Observable.

В этом посте вы также узнаете, как читать файлы с помощью Node.js и определять, когда их содержимое изменяется. Вы увидите, как выполнять повторяющиеся вызовы REST API и отправлять ответы с помощью Observable.

Предпосылки

Для выполнения задач, описанных в этом руководстве, вам потребуется следующее:

  • Node.js и npm (при установке Node.js также будет установлен npm.)
  • Учетная запись Twilio (Зарегистрируйтесь бесплатно по этой ссылке и получите дополнительный кредит на счет в размере 10 долларов США.)
  • Твилио CLI
  • Гит

Чтобы получить максимальную отдачу от этого поста, вы также должны иметь практические знания основных элементов JavaScript, механики асинхронного JavaScript и программирования ReactiveX. Если вы хотите освежить свои базовые знания о RxJS, ознакомьтесь с этими статьями:

Существует сопутствующий репозиторий, содержащий полный исходный код проекта в этом посте, доступный на GitHub.

Получение учетных данных учетной записи Twilio

Чтобы использовать интерфейс командной строки Twilio и взаимодействовать с API-интерфейсами Twilio, вам потребуются две важные части информации из панели инструментов консоли Twilio: SID учетной записи и Токен аутентификации. Вы можете найти их в верхней правой части панели инструментов.

Это пользовательские секреты, поэтому обязательно храните их в надежном месте.

Чтобы использовать свои учетные данные в процессе разработки, вам нужно сохранить их как переменные среды или в файле .env. Если вы решите хранить их в файле, убедитесь, что имя файла включено в ваш файл .gitignore, чтобы вы случайно не проверили свои пользовательские секреты в общедоступном репозитории. Для целей этого руководства вы будете хранить свои секреты как переменные среды.

Если вы используете операционную систему на основе Unix, такую ​​как Linux или macOS, вы можете установить переменные среды, используя следующие команды:

export TWILIO_ACCOUNT_SID=<your account sid>
export TWILIO_AUTH_TOKEN=<your authentication token>

Если вы являетесь пользователем Windows, используйте следующие инструкции командной строки в консоли Windows или в командной строке PowerShell:

setx TWILIO_ACCOUNT_SID <your account sid>
setx TWILIO_AUTH_TOKEN <your authentication token>

Получение номера телефона Twilio

Сообщения Twilio Programmable SMS отправляются с использованием телефонных номеров Twilio, которые обеспечивают мгновенный доступ к местным, национальным, мобильным и бесплатным телефонным номерам в более чем 100 странах с помощью удобного для разработчиков API. Вы можете бесплатно получить номер телефона Twilio как часть своей пробной учетной записи.

После создания учетной записи Twilio вы можете получить номер телефона Twilio с помощью Twilio CLI.

Если у вас установлена ​​версия Twilio CLI 1.13.0 или более ранняя, выполните следующую команду npm, чтобы обновить ее до версии 2:

npm install -g twilio-cli

Посетите страницу Twilio CLI Quickstart для получения дополнительных вариантов установки.

Если вы сохранили учетные данные Twilio в качестве переменных среды, интерфейс командной строки Twilio будет использовать их автоматически. Если вы сохранили их каким-либо другим способом, вам нужно будет сначала войти в систему, используя следующую команду:

twilio login

Чтобы получить список номеров телефонов, доступных для регистрации, используйте следующую команду, заменив, если необходимо, соответствующий код страны ISO 3166 alpha-2 на US:

twilio api:core:available-phone-numbers:local:list --country-code US

Вы должны увидеть список, похожий на следующий вывод:

Phone Number  Region  ISO Country  Address Requirements
+13852101305  UT      US           none                
+14077922414  FL      US           none                
+16033712156  NH      US           none                
+16036367116  NH      US           none                
+18312751816  CA      US           none                
+14693316717  TX      US           none                
+18312751822  CA      US           none

Вы можете использовать флаг --help, чтобы получить список всех опций, которые вы можете использовать для поиска доступного номера телефона в определенном коде города или географии. Используйте следующую инструкцию CLI:

twilio api:core:available-phone-numbers:local:list --help

Скопируйте один из номеров из списка и зарегистрируйте его в своей учетной записи Twilio с помощью следующей команды:

twilio api:core:incoming-phone-numbers:create --phone-number="+13852101305"

Если ваша попытка регистрации прошла успешно, вы должны увидеть:

SID                                 Phone Number  Friendly Name 
PN3ef900000000000000000000000000d9  +13852101305  (385) 210-1305

После регистрации номер телефона доступен для использования до тех пор, пока вы не освободите его с помощью консоли CLI или Twilio. Обратите внимание, что SID, связанный с номером телефона, является секретом пользователя и должен обрабатываться безопасно. Сохраните новый полученный номер телефона в переменной окружения TWILIO_PHONE_NUMBER в формате E.164.

Если вы используете macOS или другую операционную систему на базе Unix:

export TWILIO_PHONE_NUMBER=+1234567890

Если вы пользователь Windows:

setx TWILIO_PHONE_NUMBER +1234567890

Чтобы убедиться, что номер успешно добавлен в вашу учетную запись, отправьте тестовое SMS-сообщение на номер телефона с поддержкой SMS:

twilio api:core:messages:create --from $TWILIO_PHONE_NUMBER --to "SMS receiver phone number" --body "Hello world"

Примечание. С пробной учетной записью вы можете отправлять сообщения только на номера телефонов, которые вы ранее зарегистрировали в своей учетной записи. Номер телефона с поддержкой SMS, который вы использовали для регистрации своей учетной записи Twilio, является первым зарегистрированным вами номером.

API вернет ответ, аналогичный показанному ниже, чтобы указать, что SMS-сообщение было успешно получено и поставлено в очередь для отправки:

SID                                 From          To            Status  Direction     Date Sent
SM4a447328e80a43ceb8e61dda9f3d4cb6  +13852101305  +16463974810  queued  outbound-api  null

В течение короткого времени на ваш телефон должно прийти SMS-сообщение:

Вы можете проверить статус запроса на создание сообщения, используя следующую команду CLI:

twilio api:core:messages:fetch --sid SM4a447328e80a43ceb8e61dda9f3d4cb6

В результате вы увидите:

SID                                 From          To            Status     Direction     Date Sent                    
SM4a447328e80a43ceb8e61dda9f3d4cb6  +13852101305  +16463974810  delivered  outbound-api  Mar 13 2020 14:17:20 GMT+0100

Инициализация проекта Node.js

После того, как вы зарегистрировали и протестировали номер телефона, вы можете инициализировать проект и его репозиторий Git с помощью ряда инструкций командной строки.

Откройте окно консоли и выполните следующие инструкции в каталоге, в котором вы хотите создать каталог проекта:

mkdir iss-tracker
cd iss-tracker
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"

Вы можете узнать больше об инициализации проектов Node.js в этой публикации Фила Нэша из Twilio.

Установите зависимости, которые вы собираетесь использовать:

npm install esm rxjs twilio node-fetch

Сборка приложения

Приложение будет состоять из пяти частей, которые будут:

  1. наблюдать за файлом входных данных и загружать в программу список получателей сообщений, которые называются «звездочетами», всякий раз, когда содержимое файла изменяется
  2. выполнить повторяющийся вызов REST API, чтобы получить текущую позицию ISS и передать ее с помощью Observable
  3. сверить положение МКС с положением каждого звездочета и отправить сообщение на консоль, когда МКС приближается к звездочету
  4. отправить SMS-сообщение звездочету, к которому приближается МКС
  5. проверить статус статус SMS-сообщения

Отслеживание изменений файла с помощью RxJS Observables

Первым шагом является загрузка информации о звездочётах из входного файла и отслеживание последующих изменений.

Создайте файл stargazers.json в корневом каталоге проекта и загрузите в него следующие данные:

Поскольку это тестовые данные, которые вы будете использовать со своей пробной учетной записью Twilio, вам следует изменить значения заполнителя для элемента phoneNumber на номер телефона, который вы зарегистрировали при создании учетной записи Twilio. Таким образом, вы сможете убедиться, что сообщения успешно отправляются приложением. Используйте формат E.164. (Вы можете отправлять сообщения на любой номер телефона, обновив свою учетную запись Twilio.)

Создайте файл с именем tracker.js в корневом каталоге проекта и скопируйте в него следующий код:

Программа начинается с инициализации двух констант:

inputFilePath представляет путь к источнику данных stargazers.json

stargazers$ — это Observable, который выдает содержимое файла stargazers.json.

Реализуйте функцию readFile, которая:

  • загружает содержимое файла, используя fs.readFileSync
  • анализирует содержимое в массив объектов JSON
  • испускает этот массив через stargazers$ Observable

Скопируйте следующий код в конец файла tracker.js:

В этом коде используется конструкция try-catch, поэтому, если возникнут проблемы с загрузкой файла или его разбором, программа не сломается. Если проблем нет, stargazers$ Observable выдаст последний правильный набор данных.

Функция readFile передается как обратный вызов методу fs.watchFile, поэтому она вызывается всякий раз, когда изменяется содержимое файла stargazers.json. В следующей строке также явно вызывается загрузка начального содержимого файла.

В целях отладки подписка на stargazers$ Observable с методом log объекта console отправляет данные из stargazers.json в командную строку. Поскольку stargazers$ является Observable, при каждом изменении файла текущие данные будут отправляться на консоль.

Обратите внимание, что stargazers$ Observable инициализируется реализацией ReplaySubject. Это расширение Subject выдает, воспроизводит старые значения новым подписчикам. Количество испускаемых старых значений может быть указано параметром в конструкторе. В приведенном выше коде вы передали конструктору параметр 1, что означает, что каждый новый подписчик сразу после подписки получит текущее содержимое файла stargazers.json, включая самые последние изменения.

Работа объекта stargazers$ ReplaySubject показана на диаграмме ниже. Цветные круги обозначают данные, выдаваемые при каждом изменении файла stargazers.json. В коде эти версии являются последующими выбросами данных из файла stargazers.json:

Причина использования ReplaySubject заключается в том, что содержимое файла stargazers.json не будет часто меняться. Если вы используете Subject, который не выдает исторические данные, вам придется загрузить файл stargazers.json после создания последней подписки на stargazers$.

Запустите программу, используя следующую инструкцию командной строки:

node -r esm tracker.js

В выходных данных вы должны увидеть содержимое файла stargazers.json:

[ 
  { name: 'Jacek',
    phoneNumber: '+15017122661',
    position: { latitude: -9, longitude: -170 } },
  { name: 'Placek',
    phoneNumber: '+15017122661',
    position: { latitude: -9, longitude: -170 } } ]

По мере внесения изменений новый вывод будет появляться в окне консоли, в котором вы запустили программу. В зависимости от вашей среды разработки и настроек вы должны увидеть один или несколько экземпляров файла stargazers.json. Последняя итерация будет отражать текущее состояние файла.

Если вы не следили за кодированием и хотите догнать этот шаг, используя код из репозитория GitHub, выполните следующие команды в каталоге, где вы хотите создать каталог проекта:

git clone https://github.com/maciejtreder/iss-tracker.git
cd iss-tracker
git checkout step1
npm install

Выполнение повторяющегося вызова REST API и вывод вывода с помощью Observable

Теперь, когда у вас есть работающий процесс импорта, вы можете реализовать механизм, который опрашивает REST API для получения информации о текущей позиции ISS. Настройте операторы импорта в файле tracker.js, добавив экспорт Subject в оператор импорта из библиотеки rxjs и импортировав fetch из библиотеки node-fetch:

Замените строку stargazers$.subscribe(console.log); в файле tracker.js следующим кодом JavaScript:

В приведенном выше коде представлен новый Observable с именем issPosition$, использующий реализацию Subject. Нет необходимости отправлять исторические данные новым подписчикам, так как этот Observable будет выдавать часто. Каждую секунду функция setInterval выполняет следующее:

  • выполняет запрос GET к конечной точке http://api.open-notify.org/iss-now.json
  • анализирует ответ в формате JSON
  • испускает объект JSON, содержащий информацию о позиции ISS с issPosition$ Observable
  • ловит возможные ошибки и отправляет информацию об ошибках на консоль

Последняя строка создает подписку на issPosition$ Observable и отправляет значения, которые она выдает, на консоль.

Запустите программу:

node -r esm tracker.js

В консоли вы должны увидеть текущую позицию МКС, обновляемую каждую секунду:

{ message: 'success',
  iss_position: { latitude: '-5.7273', longitude: '140.1215' },
  timestamp: 1580312387 }
{ message: 'success',
  iss_position: { latitude: '-5.7526', longitude: '140.1397' },
  timestamp: 1580312387 }
{ message: 'success',
  iss_position: { latitude: '-5.8032', longitude: '140.1761' },
  timestamp: 1580312388 }
{ message: 'success',
  iss_position: { latitude: '-5.8792', longitude: '140.2307' },
  timestamp: 1580312390 }
{ message: 'success',
  iss_position: { latitude: '-5.9045', longitude: '140.2489' },
  timestamp: 1580312390 }
{ message: 'success',
  iss_position: { latitude: '-5.9551', longitude: '140.2853' },
  timestamp: 1580312391 }
{ message: 'success',
  iss_position: { latitude: '-6.0311', longitude: '140.3400' },
  timestamp: 1580312393 }

Остановите программу, чтобы прекратить отправку отчетов о местоположении МКС.

Код до этого момента — это ветка step2 в сопутствующем репозитории.

Сверка положения МКС с положением звездочетов

Когда у вас есть stargazers$ и issPosition$ Observables, вы можете использовать их, чтобы проверить, проходит ли МКС над положением каждого звездочета. Импортируйте операторы map, flatMap, distinctUntilChanged, filter, skip и takeUntil из rxjs/operators, добавив следующую строку вверху файла tracker.js. :

Замените строку issPosition$.subscribe(console.log) внизу файла tracker.js следующим кодом:

Функция isNearby определяет, находятся ли два набора географических координат (широта и долгота), указанные в качестве параметров, рядом друг с другом.

Вышеприведенный поток кода изображен на следующей диаграмме:

1) stargazers$ Observable преобразуется набором операторов, используемых в методе pipe. Перед преобразованием необработанный stargazers$ Observable предоставляет текущий список звездочетов, выдавая новые данные по мере изменения файла stargazers.json. Вот разбивка действий на каждом шаге с примерами вывода:

Многоточие («...») в кодовом блоке указывает на раздел, отредактированный для краткости.

[
    {
        "name": "Jacek",
        "phoneNumber": "+15017122661",
        "position": {
            "latitude": 42,
            "longitude": -83
            }
    },
    {
        "name": "Placek",
        ...
    }
 ]

2) Передача объекта JSON через оператор flatMap(x => x) преобразует Observable массива в Observable элементов массива:

{
        "name": "Jacek",
        ...
}
{
        "name": "Placek",
        ...
}

3) flatMap(stargazer => issPosition$) преобразует элементы массива звездочетов, испускаемые Observable, в Observables текущей позиции МКС:

// invoked by Jacek
{
   iss_position: { latitude: '-5.8792', longitude: '140.2307' }
}
// invoked by Placek
{
   iss_position: { latitude: '-5.8792', longitude: '140.2307' }
}

4a) Всякий раз, когда issPosition$ Observable выдает новые данные, Observable, созданный flatMapметодом, выдает данные n=number_of_stargazers раз, выдавая логическое значение, указывающее, находятся ли ISS и звездочет рядом друг с другом. Это делается путем применения оператора map(issPosition => isNearby(issPosition.iss_position, stargazer.position)) к наблюдаемому объекту issPosition$`, поэтому вывод выглядит следующим образом:

false
false
true
true
false

4b) Повторяющиеся значения удаляются следующим оператором, distinctUntilChanged(). Он преобразует Observable, чтобы он выдавал данные без повторяющихся результатов:

false
true
false

4c) Поскольку вы хотите уведомлять звездочетов только тогда, когда МКС входит в их зону действия, вы применили параметр filter(isNearby => isNearby). Теперь Observable испускает:

true
true

4d) Следующее преобразование, map( _ => 'ISS is approaching ' + stargazer.name), преобразовывает Observable так, чтобы он излучал имя звездочета, к которому приближается МКС. Теперь Observable испускает:

ISS is approaching Jacek
ISS is approaching Placek

4e) Последнее, что нужно сделать, это остановить эмиссию Observable, созданного на шаге 4, когда в программу загружается новая коллекция звездочетов. Это делается с помощью takeUntil(stargazers$.pipe(skip(1)))statement.

5) Функция console.log передала в качестве аргумента подписку на Observable, отправляет эмитированные значения в консоль.

В таблице ниже показано поведение последовательности операторов, примененных к issPosition$Observable на этапах с 4a по 4d. Предположим, что звездочет равен:

{
  "name": "Jacek",
  "phoneNumber": "+15017122661",
  "position": {
    "latitude": 120,
    "longitude": 60
  }
}

Пустые ячейки означают, что конкретный оператор не предпринял никаких действий:

Есть еще одна задача, которую необходимо решить. При изменении списка звездочетов программа по-прежнему будет уведомлять устаревшие звездочеты. Объекты Observable, созданные в пункте 3, необходимо уведомить о том, что они больше не должны выдавать данные при изменении stargazers.json.

Операция оператора takeUntil на шаге 4e, которая используется для прекращения уведомления устаревших или удаленных звездочетов, сложна. Этот оператор выдает значения из исходного Observable до тех пор, пока Observable-уведомитель не выдаст значение. В коде исходные Observables — это Observable-позиции ISS после преобразований, примененных на шаге 4. Observable-уведомитель — stargazers$.pipe(skip(1)), который выдается при каждом изменении файла stargazers.json, и пропускает повтор первоначальной эмиссии. Оператор skip(1) имеет решающее значение, потому что без него уведомитель будет выдаваться немедленно и заставлять внутренние Observables прекращать выдачу, а не когда происходит изменение в stargazers.json: когда загружается новый список звездочетов.

Процесс замены Observables, созданных на шаге 3, изображен на диаграмме ниже:

Запустите программу и посмотрите, как она работает. Зайдите на http://www.isstracker.com и проверьте текущую позицию МКС. Откройте файл stargazers.json и измените одну из записей, чтобы она представляла точку, которая будет достигнута МКС в течение следующих 2 минут. Как только МКС войдет в зону звездочета, вы должны увидеть следующий вывод в командной строке:

ISS is approaching Jacek

Остановите программу, чтобы прекратить отправку отчетов о местоположении МКС.

Код до этого момента — это ветка step3 в сопутствующем репозитории.

Отправка уведомлений с помощью Twilio Programmable SMS

Итак, вы создали программу, которая отслеживает позицию МКС и проверяет, приближается ли она к местам, указанным в файле JSON. Теперь вы можете внедрить усовершенствование для отправки SMS-уведомлений астрономам, связанным с этими координатами, когда МКС проходит поблизости.

Вы можете использовать номер телефона Twilio, полученный в начале этого руководства, для отправки SMS-сообщений, создав функцию-оболочку Observable для вспомогательной библиотеки Twilio Node.js.

Для этой цели вы собираетесь повторно использовать код из поста Подтверждение доставки SMS-сообщений с помощью RxJS Observables, Node.js и Twilio Programmable SMS. Вы можете узнать больше о Observables и создании функций-оболочек RxJS в этом посте.

Создайте файл с именем rxjs-twilio.js в корневом каталоге проекта и вставьте в него следующий код:

Файл rxjs-twilio.js экспортирует функцию sendSMS, которая принимает два параметра: номер телефона получателя и текст сообщения. Функция возвращает Observable, представляющий текущее состояние запроса на создание SMS.

Код в rxjs-twilio.js инициализирует client, который является экземпляром клиента twilio JavaScript, используя ACCOUNT_SID и AUTH_TOKEN, загруженные из соответствующих переменных среды.

Когда вызывается функция sendSMS, она отправляет запрос на создание сообщения в Twilio SMS API, затем опрашивает статус запроса и отправляет его с Observable, возвращенным sendSMS.

Ход программы для sendSMS показан на диаграмме ниже:

Чтобы использовать оболочку из rxjs-twilio.js, импортируйте ее в файл tracker.js, добавив следующую строку вверху файла:

Найдите следующую строку внизу файла tracker.js:

Замените его оператором flatMap, который вызывает функцию sendSMS, импортированную из файла rxjs-twilio.js:

После этих доработок ваша программа должна выглядеть вот так.

Убедитесь, что вы настроили переменные среды TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN и TWILIO_PHONE_NUMBER, и запустите программу:

node -r esm tracker.js

Тестирование готового приложения

Чтобы увидеть заполненное приложение в действии, вам необходимо предоставить ему номер телефона, который вы можете использовать для получения SMS-сообщений. Вам также нужно будет выйти перед МКС, когда она вращается вокруг Земли.

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

Затем с помощью ISS Tracker определить набор координат, где МКС будет через несколько минут. Поскольку приложение проверяет широту и долготу в виде целых чисел, вам не нужно быть точным, что упрощает задачу: просто добавьте 1 или 2 к текущей широте и долготе.

Затем обновите элемент в stargazers.json, указав эти значения, и подождите.

Поскольку приложение отслеживает изменения в файле stargazers.json, оно обнаружит ваши изменения и начнет сравнивать новые значения с текущим положением ISS. Когда две точки сблизятся, будет отправлено SMS-сообщение. Возможно, вам придется подождать минуту или две, в зависимости от используемых вами значений.

Приложение также отправит на консоль статус запроса на создание SMS. Эта информация возвращается Twilio SMS API при создании сообщения. Это похоже на следующий вывод:

{
  accountSid: 'ACe52e8ee9a0993322ce10707c978721fa',
  apiVersion: '2010-04-01',
  body: 'HEADS UP! ISS is approaching you!',
  dateCreated: 2020-04-19T14:50:23.000Z,
  dateUpdated: 2020-04-19T14:50:23.000Z,
  dateSent: null,
  direction: 'outbound-api',
  errorCode: null,
  errorMessage: null,
  from: '+14252797117',
  messagingServiceSid: null,
  numMedia: '0',
  numSegments: '1',
  price: null,
  priceUnit: 'USD',
  sid: 'SMb09e0d6ab3f0434b8d822c592e26772e',
  status: 'queued',
  subresourceUris: {
    media: '/2010-04-01/Accounts/ACe52e8ee9a0993322ce10707c978721fa/Messages/SMb09e0d6ab3f0434b8d822c592e26772e/Media.json'
  },
  to: '+15017122661',
  uri: '/2010-04-01/Accounts/ACe52e8ee9a0993322ce10707c978721fa/Messages/SMb09e0d6ab3f0434b8d822c592e26772e.json'
}
{
  accountSid: 'ACe52e8ee9a0993322ce10707c978721fa',
  apiVersion: '2010-04-01',
  body: 'HEADS UP! ISS is approaching you!',
  dateCreated: 2020-04-19T14:50:23.000Z,
  dateUpdated: 2020-04-19T14:50:24.000Z,
  dateSent: 2020-04-19T14:50:23.000Z,
  direction: 'outbound-api',
  errorCode: null,
  errorMessage: null,
  from: '+14252797117',
  messagingServiceSid: null,
  numMedia: '0',
  numSegments: '1',
  price: '-0.00750',
  priceUnit: 'USD',
  sid: 'SMb09e0d6ab3f0434b8d822c592e26772e',
  status: 'delivered',
  subresourceUris: {
    media: '/2010-04-01/Accounts/ACe52e8ee9a0993322ce10707c978721fa/Messages/SMb09e0d6ab3f0434b8d822c592e26772e/Media.json',
    feedback: '/2010-04-01/Accounts/ACe52e8ee9a0993322ce10707c978721fa/Messages/SMb09e0d6ab3f0434b8d822c592e26772e/Feedback.json'
  },
  to: '+15017122661',
  uri: '/2010-04-01/Accounts/ACe52e8ee9a0993322ce10707c978721fa/Messages/SMb09e0d6ab3f0434b8d822c592e26772e.json'
}

Большинство SMS-сообщений доставляются довольно быстро, поэтому вы, скорее всего, увидите результат только один раз для каждого запроса. Но если сообщение задерживается, вы увидите несколько обновлений, пока сообщение не будет доставлено. Если вы попытаетесь указать номер телефона, который не может принимать SMS-сообщения, например стационарный, вы будете видеть обновления статуса до тех пор, пока приложение не истечет лимит времени ожидания.

Остановите программу, чтобы прекратить отправку отчетов о местоположении МКС.

Код до этого момента находится в ветке step4 сопутствующего репозитория.

Возможные улучшения

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

  • МКС не видна в дневное время или когда она не находится на солнце, поэтому вы можете изменить программу, чтобы отправлять уведомления только тогда, когда станцию ​​можно увидеть.
  • Вы можете настроить беззвучный режим, чтобы не отправлять оповещения в определенные периоды времени, например, в ночное время.
  • Вы также можете информировать пользователей о направлении движения МКС, например, с юго-востока на северо-запад.

Если у вас есть другие идеи, поделитесь ими, добавив комментарий к этому посту.

Резюме

В этом посте вы увидели, как использовать RxJS Observables для мониторинга файла и REST API на предмет изменений и создания новых значений, когда это происходит. Вы также увидели, как использовать тип ReplaySubject для Observable и как объединить два наблюдаемых объекта при выполнении условия. Самое главное, вы увидели, как два Observable, работающих вместе, могут быть синхронизированы для предоставления уведомлений о событиях в реальном времени.

Дополнительные ресурсы

Twilio Programmable SMS — отправляйте и получайте текстовые сообщения по всему миру с помощью API, от которого зависят более миллиона разработчиков.

Подтверждение доставки SMS-сообщений с помощью RxJS Observables, Node.js и Twilio Programmable SMS — отправка и получение текстовых сообщений с помощью Twilio API с использованием Node.js и RxJS Observables.

Введение и учебные пособия по ReactiveX — на веб-сайте ReactiveX есть обширный список ресурсов для получения дополнительной информации о реактивном программировании и различных языковых реализациях. Это сторонние продукты, поэтому смотрите и читайте на свое усмотрение.

RxJS — веб-сайт RxJS — это место для канонической информации о библиотеке ReactiveX для JavaScript.

Каким Оператором я пользуюсь? — Полезный инструмент для выбора лучшего оператора Observables для желаемого действия.

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

Если вы хотите узнать больше о промисах JavaScript, которые являются лучшим асинхронным инструментом для некоторых ситуаций программирования, ознакомьтесь со следующими сообщениями здесь, в блоге Twilio:

Меня зовут Мацей Тредер, свяжитесь со мной через [email protected], https://www.maciejtreder.com или @maciejtreder на GitHub, Twitter и LinkedIn.

Это сообщение изначально опубликовано в Блоге Twilio.