【发布时间】:2020-10-03 19:32:04
【问题描述】:
我对节点比较陌生,并尝试创建一个网络应用程序,允许用户通过转到我的 /retrieve 路由提供 youtube 频道 ID 列表(已经在服务器中)从 youtube api 获取信息。
目前,我正在遍历具有通道 ID 的对象数组,对于每个 ID,我使用 setTimeOut 函数发送 1request/500ms(由于 youtube API 的限制)并使用 request.get 请求模块。在完成对 youtube 的所有请求后,我正在尝试继续代码和 res.send。此外,对于我从每个 youtube 请求收到的每个数据 obj,我正在解析并将它们推送到 youtubeinfo 数组。
我有一个 v12.16.3 的 nodeJS 版本。
下面是我的代码,抱歉造成混乱:
var youtubeinfo = []
router.get('/retrieve', async function(req, res, next) {
const length = datajs.length
console.log(length);
var promiseArray = [];
for(i = 0; i < length; i++){
promiseArray.push(new Promise((resolve, reject) => {
(function(i){
setTimeout(function(){
const channelID = listOfID[i]['Channel ID']
const url = youtubeAPIChannelID.concat(apiKey)
request.get(url, (err, response, data)=>{
if (!err) {
parsedData = JSON.parse(data)
if (parsedData.items){
const parsedYoutubeobj = {
"custom_collection": {
"title": parsedData.items[0].brandingSettings.channel.title,
"body_html": parsedData.items[0].brandingSettings.channel.description,
"image": {
"src": parsedData.items[0].brandingSettings.image.bannerImageUrl,
"alt": "Rails Logo"
}
}
}
youtubeinfo.push(parsedYoutubeobj)
console.log("----------------------")
console.log(parsedYoutubeobj);
youtubeinfo.push(parsedYoutubeobj);
resolve()
} else {
console.log("something is wrong...check if youtube channel still exist")
reject(error)
}
} else{
console.log("statusCode: "+ response.statusCode)
console.log("err: "+ err);
reject(error)
}
})
}, 500 * i);
}(i));
}))
}
res.send(await Promise.all(promiseArray));
});
在发出所有异步请求后,如何正确应用 promises/async/await 以使我的代码继续运行?
我认为在这里使用 Promise 会是一个解决方案。在 promiseArray 中的所有承诺解决后,如何编辑 res.send(await Promise.all(promiseArray)); 以发送字符串?
提前谢谢了。
【问题讨论】:
标签: javascript node.js express promise