Сделать несколько асинхронных подзапросов у работника cloudflare и вернуться, как только они будут выполнены? - PullRequest
0 голосов
/ 06 июня 2019

Я хочу передать массив строк работнику Cloudflare, а затем сделать так, чтобы он зацикливался на этих строках и делал GET для каждой из них, а затем добавлял JSON, get возвращает список, который работник возвращает вызывающий абонент.

Какой-то псевдокод:

var listOfAjaxResults
foreach someString in arrayOfStrings
{
    //Do AJAX call using someString and add to listOfResults
}

//Wait here until all requests in the loop have completed
//Return response form worker
return listOfAjaxResults

Я знаю, как сделать не блокирующий запрос согласно этой SO записи. Что я не могу понять, это:

  1. Как вернуть только после завершения всех запросов из цикла
  2. Какую многопотоковую структуру данных использовать, чтобы при завершении каждого запроса она смело могла добавлять свой результат в список.

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Вы можете использовать Promise.all , повторно используя ваш пример:

async function example() {
    let arrayOfStrings = ["a", "b", "c"]

    let promises = []
    for (let str of arrayOfStrings) {
        // a single fetch request, returns a promise
        // NOTE that we don't await!
        let promise = fetch(str)

        promises.push(promise)
    }

    let results = await Promise.all(promises)
    // results is now an array of fetch results for the requests,
    // in the order the promises were provided
    // [fetchResult_a, fetchResult_b, fetchResult_b]

    return results
}
1 голос
/ 12 июня 2019

Promise.all - это путь, в документах даже есть простой пример того, как его использовать в Workers: https://developers.cloudflare.com/workers/recipes/aggregating-multiple-requests/

Если какой-либо из запросов не выполняется awaitingна Promise.all будет выброшено, поэтому было бы неплохо добавить в try/catch при желании.

...