Есть ли более элегантный способ сдвинуть и вернуть массив? - PullRequest
0 голосов
/ 14 октября 2019

Я все еще разбираюсь с Обещаниями, но, работая с ними, я понял, что было бы неплохо уменьшить массив объектов выборки и поставить рядом с ними некоторые дроссели. Создавая свою медленную функцию запросов, я понял, что не могу придумать элегантный способ вставить массив и вернуть этот массив лучше, чем этот.

ТАК. Мой вопрос Есть ли более элегантный способ отправки в массив и возврата массива за один шаг в 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 элементов, так что это не так уж и сложно.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Более чистый и эффективный эквивалент общей операции

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

использует flatMap:

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

Однако в контексте вашего вопросасоздание throttle(t) рядом с каждой операцией выборки в Promise.all является полностью и однозначно неправильным . Все таймеры setTimeout будут работать параллельно и разрешаться одновременно, поэтому нет смысла создавать более одного таймера. Они также не взаимодействуют с операциями извлечения, просто задерживают общее выполнение обещания, которое возвращает slowQrys, и запутывают массив, к которому оно разрешается.

0 голосов
/ 14 октября 2019

Я бы предположил, что ваша цель состоит в том, чтобы связать ваши выборки так, чтобы два последовательных выборки были принудительно разнесены по крайней мере на 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())
...