我一直在尝试生成自定义对象数组或JSON对象,以获取Twilio获取会议API提供的会议对象的特定字段。但是由于Node.js是异步的,因此无法实现该目标,并且由于在每个函数中被回调,因此返回的状态不确定。尝试了各种方法,但由于注册了node.js的操作性质而无法获得结果,并且执行了下一条语句。还尝试了promise和async-await的各种选择。但是,无法获得可能是在每个循环中回调的结果(我的猜测)。
由于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);
}
答案 0 :(得分:2)
这里是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
注入是会议列表。然后,您可以map
在会议上构建所需的对象,并将它们作为响应返回。
更新
如果要使用Promise和async
和await
,则list
方法也会返回一个Promise。您可以像这样使用它。
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);
}
答案 1 :(得分:1)
您应该只能将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);
})
答案 2 :(得分:1)
感谢大家的回应,特别是Phil提到了具有地图功能的列表方法。但是,使用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);
})
})
}