【问题标题】:Is there a more elegant way to push and return an array?有没有更优雅的方式来推送和返回数组?
【发布时间】:2020-02-11 10:14:26
【问题描述】:

我仍在研究 Promises,但在使用它们时,我意识到减少 fetch 对象数组并在它们旁边放置一些限制会很好。在创建慢速查询函数时,我意识到我想不出一种优雅的方式来推送到数组并返回该数组比这更好。

所以。我的问题是; 在 JavaScript 中,有没有比这更优雅的方式来推送数组并一步返回数组?

const mQry = q => fetch(q).then(r=>r.json()); // Fetches and returns json
const throttle = t => new Promise(r=>setTimeout(r,t)); // adds a promised timeout

const slowQrys = (q,t) => // pass in an array of links, and a number of milliseconds
    Promise.all(q.reduce((r,o)=> // reduce the queries

        // Here's the big issue. Is there any more elegant way
        // to push two elements onto an array and return an array?
        [...r, mQry(...o), throttle(t)]

    ,[]);

在任何人说之前,我非常清楚拆分数组可能效率不高,但我可能从未使用超过 10 个项目,所以这不是什么大问题。

【问题讨论】:

  • flatMap,但是您使用 throttle 的方式毫无意义。它应该做什么? (是否有意并行运行提取?)
  • 这不是节流。节流将防止函数被过度调用——至少在这段代码中,这似乎没有做任何事情。
  • 老实说,我对这段代码感到很困惑。很难理解一个字母变量是什么。但它似乎你应该能够做r.concat(mQry(...o), throttle(t))而不是创建一个新数组并传播。
  • @VLAZ:这完全一样。
  • @Ry- 它比扩展和重新创建数组更“优雅”。虽然,正如我所说,我不确定这段代码应该做什么。我的大脑拒绝处理它,所以我就放弃了。

标签: javascript arrays promise


【解决方案1】:

我猜你的意图是链接你的 fetch(s),这样两个连续的 fetch 强制间隔至少 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())

【讨论】:

  • 不是我要的,而是简洁的实现。
  • 那我(也不)不明白你的目标。您提供的实施基本上并行启动所有提取+所有相关的“节流”(这并不是真正有用,因为它们不会减慢 Promise.all 的最终同步之外的任何东西)。如果您的目标是获取,等待,获取等待,...,那么使用减少,例如我提供的构造? (p.then(_=>fetch(link)).then(_=>wait(t)))
  • 我不是在问如何让整个事情变得更好。我在问是否有一种更优雅的方式来返回一个数组,同时将一个新值推入其中。
  • 那么 VLAZ 是要走的路,使用 concat 你也可以 r.push(a,b), r 使用你返回的表达式的值是 r (这是对你的数组的引用)的事实跨度>
【解决方案2】:

比一般操作更清洁、更高效的等价物

q.reduce((r, o) =>
    [...r, f(...o), g(t)])

使用flatMap:

q.flatMap(o =>
    [f(...o), g(t)])

但是,就您的问题而言,在 Promise.all 中的每个提取操作旁边创建一个 throttle(t)完全且明确错误的。所有setTimeout 计时器将并行运行并同时解析,因此创建多个计时器没有意义。它们也不与 fetch 操作交互,只是延迟了 Promise slowQrys 返回的整体实现并混淆了它解析到的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2016-01-23
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多