Примечание редактора: Вы новичок в использовании Twilio с node.js? Если да, то вам, возможно, стоит сначала ознакомиться с этой вводной статьей в блоге. Вы также можете найти справочную документацию для модуля Twilio Node здесь. Знаете, что делаете? Просто npm install —save twilio, чтобы начать 🙂
Одной из основных целей проектирования node.js является предотвращение блокирующих операций, где это возможно. Это приводит к тому, что многие ядерные модули системы Node предоставляют асинхронные интерфейсы, которые принимают функцию обратного вызова. Эта функция будет вызвана в какой-то момент в будущем, когда завершится запрошенная операция, как в функции «readFile» в модуле файловой системы Node:
Эта функция обратного вызова принимает два аргумента – первый является объектом ошибки, который содержит любую ошибку, возникшую во время выполнения задачи. Второй аргумент – это фактические данные, возвращенные из API. Этот стиль обратного вызова и сигнатура являются общими для ядра Node и многих популярных модулей в пользовательской области. Если вы еще не сделали этого, ознакомьтесь с презентацией Айзека с TxJS 2013, которая хорошо объясняет, почему обратные вызовы являются стандартными для многих API в Node. Вам также может понравиться статья Айзека о проектировании асинхронных API. Короче говоря: не выпускайте Залго.
Модуль Twilio изначально был разработан только с этим интерфейсом обратного вызова:
Это работает отлично, если вы делаете только один запрос к Twilio. Но если вы будете делать несколько запросов, этот интерфейс обратного вызова потенциально может привести к тому, что ваш код быстро разрастется вправо, образуя страшную пирамиду гибели:
Одним из средств (но не единственным) от пирамиды гибели является использование промисов вместо обратных вызовов для асинхронного кода. Если вы не знакомы с промисами, ребята из StrongLoop имеют отличный ресурс на своем блоге, чтобы помочь вам понять эту концепцию.
Промисы имеют многие другие преимущества, помимо предотвращения пирамиды гибели. Другое большое преимущество заключается в том, что мы можем передавать значение промиса внутри нашего приложения, и другие части нашей программы могут получить доступ к результату асинхронного вызова, независимо от того, завершена ли асинхронная операция. Для более подробной информации о том, почему и когда вы можете использовать промисы, прочитайте статью StrongLoop и README-библиотеку Q.
Начиная с выпуска 1.4.0 модуля twilio на npm, теперь есть необязательный интерфейс промисов, который вы можете использовать для получения данных из API. Оригинальный интерфейс обратного вызова по-прежнему поддерживается на 100% и всегда будет поддерживаться. Разница заключается в том, что для всех запросов REST-клиента модуль twilio теперь возвращает промис (используя де-факто стандартную библиотеку промисов Node.js Q), который вы можете использовать по своему усмотрению.
Вот простой пример того, как вы можете сделать звонок с помощью модуля twilio, используя новый интерфейс промисов:
В простых случаях, как этот, преимущества использования промиса не очевидны. На самом деле, для одиночных вызовов API Twilio (например, отправки текстового сообщения или совершения звонка) интерфейс обратного вызова, вероятно, является более простым механизмом. Однако преимущества использования промисов быстро становятся очевидными для более сложных случаев использования. Давайте вернемся к тому отвратительному коду доступа к API Twilio REST, который мы написали ранее, чтобы увидеть, как промисы могут сделать его немного лучше:
Это может быть немного длиннее в терминах строк кода, но у него есть преимущества в читаемости. Мы успешно сгладили пирамиду, поэтому наш код теперь читается сверху вниз, а не слева направо И сверху вниз. Мы можем объединить нашу логику обработки ошибок, чтобы она срабатывала, когда любые из трех вызовов API завершаются неудачно (если мы хотим). Мы также можем легко определить функцию, которая будет выполняться, независимо от того, что произойдет, когда все асинхронные вызовы будут завершены.
Начиная с twilio-node 1.4.0, промисы (в дополнение к обратным вызовам) поддерживаются для обработки асинхронных вызовов API Twilio. Промисы могут быть полезны для сглаживания пирамиды гибели и для передачи результатов асинхронной операции внутри приложения.
Если вы делаете только один вызов к Twilio, интерфейс обратного вызова, вероятно, является вашим лучшим выбором. Если вам нужно передать результат асинхронного вызова или сделать несколько запросов API, интерфейс промисов может иметь смысл. Любой из них полностью нормален и поддерживается модулем.
Сообщите нам, что вы думаете о использовании промисов в модуле twilio для Node.js по адресу @kevinwhinnery