Функция Twilio Javascript для анализа массива

#javascript #twilio

Вопрос:

У меня есть функция Javascript twilio, которая выполняется в моем потоке studio сразу после того, как кто-то звонит по соответствующему телефону studio flow #. Эта функция должна проверять, выполняется ли в данный момент активная конференц-связь, и возвращать либо «True», либо «False», чтобы я мог затем использовать эту строку в виджете if/else для подключения вызывающего абонента ИЛИ инициирования новой конференции.

     // This is your new function. To start, set the name and path on the left.

exports.handler = function(context, event, callback) {
  
    var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
    var xhr = new XMLHttpRequest();
    xhr.withCredentials = true;
    
xhr.open("GET", "https://api.twilio.com/2010-04-01/Accounts/myAccountSid/Conferences.json?FriendlyName=mySidDocumentName");
xhr.setRequestHeader("Authorization", "Basic myAuthString");
xhr.send();

    xhr.addEventListener("readystatechange", function() {
        if(this.readyState == 4) {
            console.log(JSON.stringify(xhr.responseText));
            var jsonResponse = JSON.parse(xhr.responseText);
            var arrayLength = Object.keys(jsonResponse.Conferences[jsonResponse]).length;
            if (arrayLength > 0) {
              var isConferenceOngoing = "True"
            } else {
              var isConferenceOngoing = "False"
            }
        }
        return callback(null, isConferenceOngoing);
    });
};
 

«Конференции» ключ, который меня интересует, в ответ, — это массив, и это вызывает проблемы, потому что Twilio не может разобрать массив в студии потока, так что это должно быть сделано в вызове функции: https://www.twilio.com/docs/studio/widget-library/http-request «обратите внимание, что, хотя массив имеет формат JSON, если ваш запрос возвращает массив объектов, он не будет обработан.»

Поэтому все, что мне просто нужно проверить, является ли массив конференций пустым, и если это так, верните «False» в мой поток studio ИЛИ если есть активная конференция (т. Е. Длина массива > 0), затем верните «True». Возврат «True» или «False» позволит мне создать виджет if/else в потоке моей студии, чтобы либо подключить вызывающего абонента к существующей конференции, либо начать новую конференцию.

Вот как выглядит ответ в Postman, когда нет активного конференц-вызова (обратите внимание, что массив конференций пуст): введите описание изображения здесь

Мои знания Javascript близки к нулю, но я думаю, что я близок к этому.

Ответ №1:

Обновление: Добавлены функции асинхронности/ожидания на основе комментариев.

 exports.handler = function(context, event, callback) {
      
const twilioClient = context.getTwilioClient();

let responseObject = twilioClient.conferences
      .list({status: 'in-progress'})
 
var isConferenceOngoing = null     
  
async function setConferenceVariable() {  
      if (responseObject.Length > 0)
      {
            isConferenceOngoing = "True"
      } else {
            isConferenceOngoing = "False"
      }
}

async function getConferenceDetails() {
     await setConferenceVariable();
     return callback(null, isConferenceOngoing);
}
getConferenceDetails()
};
 

Последнее обновление: Более простой метод ниже.

 exports.handler = function(context, event, callback) {
    const twilioClient = context.getTwilioClient();
    twilioClient.conferences
        .list({status: 'in-progress'})
        .then(conferences => { callback(null, !conferences.length)})
};
 

Комментарии:

1. Не уверен, что это будет последовательно работать, ваш обратный звонок находится не в том месте @dylan, twilio.com/docs/runtime/functions/… (поскольку он возвращает обещание, вам нужно будет подождать)

2. Я отредактировал код, чтобы включить функции async/await. Пожалуйста, дайте мне знать, если это выглядит хорошо.

Ответ №2:

Последнее обновление выглядит намного лучше @dylan. Я не вижу возвращаемого значения при значении false, поэтому сделал это:

 exports.handler = function(context, event, callback) {
    const twilioClient = context.getTwilioClient();
    twilioClient.conferences
        .list({status: 'in-progress'})
        .then(conferences => callback(null, {result: !conferences.length}))
        .catch(err => callback(err));
};
 

Комментарии:

1. Не могли бы вы уточнить? ! массив должен возвращать значение True, если массив пуст, но значение False, если он не пуст. Не говорю, что вы ошибаетесь, но мне трудно протестировать только один номер телефона, когда мне нужно 3.

2. Я думаю, что это связано с возвращением логического значения false при обратном вызове, которое имеет какой-то странный эффект, так как ничего не возвращается.