【发布时间】:2021-12-23 03:10:21
【问题描述】:
我有一个 API js 文件,我用 POST 方法调用它,传入一个对象数组,每个对象都包含一个站点 url(大约 26 个对象或 url)作为正文,并使用下面的代码循环遍历这个数组(sites),检查每个对象的 url 是否返回一个 json,方法是在 url 添加 "/items.json",如果是,将 json 内容推送到另一个最终数组 siteLists,我将其作为响应发回。
问题仅在于 26 个 url,此 API 调用需要超过 5 秒 才能完成,是我做错了还是它只是 fetch 在 Node.js 中的工作方式?
const sites 内容如下:
[{label: "JonLabel", name: "Jon", url: "jonurl.com"},{...},{...}]
代码是:
export default async (req, res) => {
if (req.method === 'POST') {
const body = JSON.parse(req.body)
const sites = body.list // this content shown above
var siteLists = []
if (sites?.length > 0){
var b=0, idd=0
while (b < sites.length){
let url = sites?.[b]?.url
if (url){
let jurl = `${url}/items.json`
try {
let fUrl = await fetch(jurl)
let siteData = await fUrl.json()
if (siteData){
let items = []
let label = sites?.[b]?.label || ""
let name = sites?.[b]?.name || ""
let base = siteData?.items
if(base){
var c = 0
while (c < base.length){
let img = base[c].images[0].url
let titl = base[c].title
let obj = {
url: url,
img: img,
title: titl
}
items.push(obj)
c++
}
let object = {
id: idd,
name: name,
label: label,
items: items
}
siteLists.push(object)
idd++
}
}
}catch(err){
//console.log(err)
}
}
b++
}
res.send({ sites: siteLists })
}
res.end()
}
编辑:(解决方案?)
因此,似乎带有承诺的代码如下所示,并标记为解决方案在更快的意义上工作,有趣的是它仍然需要超过 5 秒的时间来加载并且仍然抛出 Failed to load resource: the server responded with a status of 504 (Gateway Time-out) 错误,因为 Vercel,其中该应用程序托管传递给无服务器功能的最大超时时间为 5 秒,因此永远不会在响应中加载内容。在本地,我没有超时限制的地方加载速度明显更快,但令我惊讶的是,这样的查询需要这么长时间才能完成,而它应该是毫秒的问题。
【问题讨论】:
-
您是按顺序调用这些调用,为什么不并行调用它们?
标签: javascript node.js api fetch httpresponse