我正在制作一个 Express 服务器,它将视频从 youtube 播放列表转换为 xml 播客提要。我的 app.get 返回一些生成的 xml:
app.get("/", function(req, res) {
res.set('Content-Type', 'text/xml');
return res.send(xml(myXmlContent, { declaration: true }));
})
Run Code Online (Sandbox Code Playgroud)
我需要用一些数据填充 myXmlContent,包括 youtube 播放列表中的视频 ID。我可以使用 youtube API 来获取这些视频 ID,但它不是同步的。它在回调中返回 ID。
在从 app.get 返回之前,我怎样才能等到得到结果?我可能会以错误的方式解决这个问题,因为超时可能是一个问题。关于如何实现依赖异步调用的动态 xml 生成的任何建议?
在从 app.get 返回之前,我怎样才能等到得到结果?
你不会在 Javascript 中“等待”。相反,当您从其他 API 调用获得结果时,您在回调中发送响应。这就是 node.js 中异步开发的工作原理。
在从 app.get 返回之前,我怎样才能等到得到结果?
你没有。您可以app.get()在发送响应之前从正常状态返回。这并不意味着您已经完成了处理。 app.get()(以及 express 中间件)旨在您可以使用异步操作来获取响应数据。您只需返回,然后在异步操作完成并获得所需数据后的某个时间发送响应。
我可能会以错误的方式解决这个问题,因为超时可能是一个问题。
这不是错误的方法。但是,如果您的外部 API 真的很慢,那么您可能不得不担心 Express 超时或浏览器超时。快速超时,您可以配置。浏览器超时并不容易处理。如果需要很长时间才能获得浏览器超时的结果,那么您可能需要重新考虑您的工作方式,因为任何普通用户都会放弃页面请求或按钮按下,如果它需要很长时间浏览器超时。
获得数据后,有几种发送数据的选项。由于您没有显示您正在使用的外部 API 及其工作原理,因此我们不能非常具体。但一般来说,你会做这些事情:
res.send()来自其他 API 的异步完成回调放入内部。res.send()放入 promise 的.then()处理程序中。举个例子:
const rp = require('request-promise');
app.get("/", function(req, res) {
rp(someURL).then(result => {
// do some processing of result into finalData
res.send(finalData);
}).catch(err => {
console.log(err);
res.sendStatus(501);
});
});
Run Code Online (Sandbox Code Playgroud)