并行异步迭代器——可能吗?
Parallel asynchronous iteraor - is it possible?
现在我有以下代码:
import axios from 'axios'
const urls = ['https://google.com', 'https://yahoo.com']
async function* requests() {
for (const url of urls) {
yield axios.get(url)
}
}
;(async () => {
for await (const n of requests()) {
console.log(n.config.url) // prints https://google.com and then https://yahoo.com
}
})()
照原样,请求不会阻塞节点的单个线程,但它们会按顺序发生。我想知道是否可以更改代码以强制并行。
"simpler" no-deps 方法是对它们进行批处理并生成每批 Promise.all
import axios from 'axios'
const urls = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/posts/1',
'https://jsonplaceholder.typicode.com/users/1',
'https://jsonplaceholder.typicode.com/comments/1'
]
async function* requests(batchSize = 1) {
let batchedRequests = [];
for (const url of urls) {
batchedRequests.push(axios.get(url));
if (batchedRequests.length === batchSize) {
yield Promise.all(batchedRequests);
batchedRequests = [];
}
}
if (batchedRequests.length) { //if there are requests left in batch
yield Promise.all(batchedRequests);
}
}
;(async () => {
for await (const batch of requests(2)) {
batch.forEach(n => console.log(n.config.url)) // prints https://google.com and then https://yahoo.com
}
})()
您可以使用 rxjs
来获得类似的结果,具有可观察对象在灵活性方面的优势,但它是另一个库,如果您不熟悉反应流,它可能会更复杂。这是我在该主题上找到的详细 [=19=]:https://medium.com/@ravishivt/batch-processing-with-rxjs-6408b0761f39
现在我有以下代码:
import axios from 'axios'
const urls = ['https://google.com', 'https://yahoo.com']
async function* requests() {
for (const url of urls) {
yield axios.get(url)
}
}
;(async () => {
for await (const n of requests()) {
console.log(n.config.url) // prints https://google.com and then https://yahoo.com
}
})()
照原样,请求不会阻塞节点的单个线程,但它们会按顺序发生。我想知道是否可以更改代码以强制并行。
"simpler" no-deps 方法是对它们进行批处理并生成每批 Promise.all
import axios from 'axios'
const urls = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/posts/1',
'https://jsonplaceholder.typicode.com/users/1',
'https://jsonplaceholder.typicode.com/comments/1'
]
async function* requests(batchSize = 1) {
let batchedRequests = [];
for (const url of urls) {
batchedRequests.push(axios.get(url));
if (batchedRequests.length === batchSize) {
yield Promise.all(batchedRequests);
batchedRequests = [];
}
}
if (batchedRequests.length) { //if there are requests left in batch
yield Promise.all(batchedRequests);
}
}
;(async () => {
for await (const batch of requests(2)) {
batch.forEach(n => console.log(n.config.url)) // prints https://google.com and then https://yahoo.com
}
})()
您可以使用 rxjs
来获得类似的结果,具有可观察对象在灵活性方面的优势,但它是另一个库,如果您不熟悉反应流,它可能会更复杂。这是我在该主题上找到的详细 [=19=]:https://medium.com/@ravishivt/batch-processing-with-rxjs-6408b0761f39