gpt4 book ai didi

javascript - 每个已解决的 Promise.map 和回调

转载 作者:行者123 更新时间:2023-12-03 02:55:45 24 4
gpt4 key购买 nike

我有一个 URL 数组,我正在将其映射(使用 bluebird 的 Promise.map)到设置了最大并发数的 http GET 请求:

const fetchingPages = Promise.map(urls, async url => {
const data = await fetchPage(url)
return data
}, { concurrency: 100 })
const pages = await fetchingPages

如何监听每个正在解决的 promise 并以有组织的方式执行一些副作用,即不要将副作用放入 .map 回调中?

理想情况下,我希望提前拥有一组“空/虚拟” promise ,这样我就可以在发送相应的 GET 请求之前将回调设置为其中任何一个。

我可以这样做:

const pagesUtils = urls.map((url) => {
let resolve, reject
const promise = new Promise((res, rej) => {
resolve = res
reject = rej
})
return {
url,
promise,
resolve,
reject,
}
})

const pagesPromises = pagesUtils.map(x => x.promise)

Promise.map(urlsFinal, async (url, i) => {
const data = await fetchPageData(url)
pagesUtils[i].resolve(data)
return data
}, { concurrency: CONCURRENCY })

pagesPromises.forEach(p => {
p.then((result) => {
// side-effect
console.log(result)
})
})

const results = await Promise.all(pagesPromises)

怎样才能以理想的方式做到这一点?谢谢。

最佳答案

从您的评论来看,您似乎对在 map 回调中放置大量代码感到烦恼。您不必像往常一样将各个逻辑位放入离散的可组合函数中,然后调用它们。例如:

const fetchingPages = Promise.map(urls, async url => {
let data = await fetchPage(url)
data = await doThis(data)
if (/*...some condition...*/) {
data = await doThat(data)
}
return data
}, { concurrency: 100 })
const pages = await fetchingPage

(当然,如果它们也是异步的,您只需 await doThisdoThat。)

或者用 promise 术语插入async/await:

const fetchingPages = Promise.map(urls, url => {
return fetchPage(url)
.then(doThis)
.then(data => /*...some condition...*/ ? doThat(data) : data)
}, { concurrency: 100 })
const pages = await fetchingPage

关于javascript - 每个已解决的 Promise.map 和回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47636322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com