Javascript 有没有更优雅的方法来推送和返回数组?
我仍然在考虑承诺,但在使用它们的过程中,我意识到减少一个fetch对象数组并在它们旁边设置一些限制是很好的。在创建我的慢速查询函数时,我意识到我想不出比这更好的方法来推送数组并返回该数组 所以。我的问题是,在Javascript中,有没有比这更优雅的方法一步推送到数组并返回数组?Javascript 有没有更优雅的方法来推送和返回数组?,javascript,arrays,promise,Javascript,Arrays,Promise,我仍然在考虑承诺,但在使用它们的过程中,我意识到减少一个fetch对象数组并在它们旁边设置一些限制是很好的。在创建我的慢速查询函数时,我意识到我想不出比这更好的方法来推送数组并返回该数组 所以。我的问题是,在Javascript中,有没有比这更优雅的方法一步推送到数组并返回数组? constmqry=q=>fetch(q)。然后(r=>r.json());//获取并返回json const throttle=t=>newpromise(r=>setTimeout(r,t));//添加承诺的超时
constmqry=q=>fetch(q)。然后(r=>r.json());//获取并返回json
const throttle=t=>newpromise(r=>setTimeout(r,t));//添加承诺的超时
const slowQrys=(q,t)=>//传入一个链接数组,以毫秒为单位
Promise.all(q.reduce((r,o)=>//减少查询
//这是一个大问题。还有更优雅的方式吗
//将两个元素推送到一个数组并返回一个数组?
[…r,mQry(…o),节流阀(t)]
,[]);
在别人说之前,我非常清楚拆分数组可能效率不高,但我可能从来没有使用过超过10个项目,所以这不是什么大问题。我猜您的意图是链接您的获取,这样两个连续的获取必须至少间隔
t
ms
这条链子就是这样的
Promise.all([fetch, wait]), Promise.all([fetch, wait]), ...
这样写的方法是
const slowQrys = (links, t)=>links.reduce((p, link)=>{
return p.then(_=>{
return Promise.all([
fetch(link),
wait(t)
])
})
}, Promise.resolve())
与一般操作相比,更清洁、更高效
q.reduce((r, o) =>
[...r, f(...o), g(t)])
用途:
但是,在您的问题中,创建
节流阀(t)
位于承诺中每个提取操作的旁边。所有都是完全错误的。所有setTimeout
计时器都将并行运行并同时解析,因此没有必要创建多个计时器。它们也不会与提取操作交互,只会延迟整个任务的完成promiseslowQrys
返回并弄乱它解析到的数组。flatMap
,但是你使用节流阀的方式毫无意义。它应该做什么?(是并行运行抓取吗?)这不是节流。节流将防止函数被过度调用-至少在这段代码中,这似乎没有任何作用。老实说,我被这段代码弄糊涂了。很难理解单字母变量是什么。但似乎您应该能够执行r.concat(mQry(…o),throttle(t))
而不是创建一个新的数组并进行传播。@VLAZ:这完全是一样的。@Ry-这比传播并重新创建数组更“优雅”。虽然,正如我所说,我不确定这段代码应该做什么。我的大脑拒绝处理它,所以我只是放弃了。不是我要求的,而是简洁的实现。然后我(两者都不是)不了解您的目标。Implem(如您提供的)基本上会并行启动所有抓取+所有相关的“节流”(这不是很有用,因为它们不会减慢Promise.all的最终同步之外的任何速度)。如果您的目标是获取、等待、获取等,那么使用reduce,如我提供的构造?(p.then(=>fetch(link))。然后(=>wait(t))
)我不是在问如何使整个事情变得更好。我是在问是否有一种更优雅的方法来返回数组,同时将一个新值推入其中。然后VLAZ是一种方法,使用concat
你也可以r.push(a,b),r
使用返回的表达式的值是r这一事实(它是对数组的引用)
q.flatMap(o =>
[f(...o), g(t)])