0

我想将一个字符串数组传递给 Cloudflare 工作人员,然后让它遍历这些字符串并为每个字符串执行一个 GET,然后将 get 返回的 JSON 添加到工作人员返回给调用者的列表中。

一些伪代码:

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. 使用什么样的线程安全数据结构,以便在每个请求完成时可以安全地将其结果添加到列表中。
4

2 回答 2

2

您可以使用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
}
于 2019-06-06T16:24:30.240 回答
1

Promise.all是要走的路,文档中甚至有易于理解的示例如何在 Workers 中使用它:https ://developers.cloudflare.com/workers/recipes/aggregating-multiple-requests/

如果任何请求失败awaitingPromise.all将抛出,因此如果需要,将其包裹起来可能是个好主意try/catch

于 2019-06-12T09:18:02.003 回答