как создать пользовательский объект / массив, используя функцию конференции Twilio для выборки в Node.js - PullRequest
0 голосов
/ 12 ноября 2018

Я пытался сгенерировать массив пользовательских объектов или JSON-объект для выборки определенных полей объекта конференций, предоставляемых API-интерфейсом извлечения Twilio. Но поскольку Node.js является асинхронным, он не может этого достичь и получает неопределенное значение в ответ, так как их вызывает в каждой функции. Перепробовал различные подходы, но не смог получить результат, так как из-за характера операции обратного вызова node.js регистрируется и выполняется следующий оператор. Перепробовал различные варианты обещаний и асинхронных ожиданий. Тем не менее, невозможно достичь результата, который может быть обратным вызовом в каждом цикле (мое предположение).

Так как новичок в Node.Js, так что нужно некоторое предложение, как достичь. Одним из вариантов является использование settimeout, но, опять же, это не является подлинным решением, так как в случае работающей системы невозможно получить информацию о том, сколько времени требуется. Код указан ниже:

exports.fetchLiveConferences = function(req, res, next) {
    let conferencesArray = [];

    client.conferences.each({
        dateCreated: new Date(),
        status: 'In-progress'
    }, conferences => {
        /* call back function at this point conferences object is available and can extract properties so pushing it to my array.
         */
        conferencesArray.push({
            conferenceSid: conferences.sid,
            conferenceName: conferences.friendlyName,
            conferenceStatus: conferences.status,
        });
    })

    console.log(conferencesArray);
    /* due to async nature the below statement is executed once call back is registered by node.js in event loop and undefined is returned. 
     */
    res.send(conferencesArray);
}

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Разработчик Twilio здесь.

Ваша проблема здесь в том, что вы используете each для составления списка конференций независимо. Если вы просто хотите работать со списком, вам следует использовать метод list и затем возвращать результаты в обратном вызове.

Попробуйте что-то вроде этого.

exports.fetchLiveConferences = function(req, res, next) {
  client.conferences.list({
      dateCreated: new Date(),
      status: 'In-progress'
  }, (err, conferences) => {
    if (err) { console.error(err); return; }
    conferencesArray = conferences.map(conference => ({
        conferenceSid: conference.sid,
        conferenceName: conference.friendlyName,
        conferenceStatus: conference.status,
    }));
    res.send(conferencesArray);
  })
}

В этом случае conferences onject в обратном вызове является списком конференций. Затем вы можете map проводить конференции и строить нужные объекты, возвращая их в качестве ответа.

Обновление

Если вы хотите использовать обещания и async и await, метод list также возвращает обещание. Вы можете использовать это так.

const fetchConferenceList = () => {
  return client.conferences.list({
    dateCreated: new Date(),
    status: 'In-progress'
  }).then(conferences => conferences.map(conference => ({
    conferenceSid: conference.sid,
    conferenceName: conference.friendlyName,
    conferenceStatus: conference.status,
  })));
}

exports.fetchLiveConferences = async function(req, res, next) {
  const conferenceData = await fetchConferenceList();
  res.send(conferenceData);
}
0 голосов
/ 02 декабря 2018

Спасибо всем за ответы, особенно Филу за упоминание списка подходов с функцией карты.Однако, используя метод twilio .each (), я смог сгенерировать пользовательский объект со следующим кодом.

exports.fetchLiveConferences = async function fetchLiveConferences(req, res, next){
const conferenceData = await fetchConferenceList();
res.send(conferenceData);
}

fetchConferenceList = function () {
let conferenceArray = [];
return new Promise((resolve, reject) => {
    client.conferences.each({
            dateCreated: new Date(),
            status: 'in-progress'
        },
        conferences => {
            conferenceArray.push({
                conferenceSid: conferences.sid,
                conferenceName: conferences.friendlyName,
                conferenceStatus: conferences.status
            });
            resolve(conferenceArray);
        })
})
}  
0 голосов
/ 12 ноября 2018

Вы должны просто иметь возможность поместить свою функцию res.send в функцию обратного вызова следующим образом:

client.conferences.each({
    dateCreated: new Date(),
    status: 'In-progress'
}, conferences => {
    /* call back function at this point conferences object is available and can extract properties so pushing it to my array.
     */
    conferencesArray = conferences.map(c => {
        return {
            conferenceSid: c.sid,
            conferenceName: c.friendlyName,
            conferenceStatus: c.status,
        }
    });
    res.send(conferencesArray);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...