有没有更优雅的方式来推送和返回数组?

时间:2019-10-14 19:03:18

标签: javascript arrays promise

我仍在弄清Promises,但是在与Promises一起工作时,我意识到减少一个fetch对象的数组并在它们旁边放一些节流阀是很好的。创建慢速查询功能时,我意识到我想不出一种优雅的方式来推入数组并比此方法更好地返回该数组。

SO。我的问题是; 在Java脚本中,有没有比这更优雅的方法来推入数组并返回数组了?

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个项目,因此这不是什么大问题。

2 个答案:

答案 0 :(得分:1)

与常规操作相比更清洁,更高效

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

使用flatMap

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

但是,在您遇到的问题中,在throttle(t)中的每个提取操作旁边创建一个Promise.all完全是毫无疑问的。所有setTimeout计时器将并行运行并同时解析,因此创建多个计时器毫无意义。它们也不与获取操作进行交互,只是延迟了承诺slowQrys返回的总体实现,并弄混了要解析的数组。

答案 1 :(得分:0)

我想您的目的是链接您的提取,以便两次连续的提取必须至少间隔t毫秒

因此链接是

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())