【发布时间】:2020-04-15 15:59:56
【问题描述】:
我有一个承诺列表,目前我正在使用 promiseAll 来解决它们
这是我现在的代码:
const pageFutures = myQuery.pages.map(async (pageNumber: number) => {
const urlObject: any = await this._service.getResultURL(searchRecord.details.id, authorization, pageNumber);
if (!urlObject.url) {
// throw error
}
const data = await rp.get({
gzip: true,
headers: {
"Accept-Encoding": "gzip,deflate",
},
json: true,
uri: `${urlObject.url}`,
})
const objects = data.objects.filter((object: any) => object.type === "observed-data" && object.created);
return new Promise((resolve, reject) => {
this._resultsDatastore.bulkInsert(
databaseName,
objects
).then(succ => {
resolve(succ)
}, err => {
reject(err)
})
})
})
const all: any = await Promise.all(pageFutures).catch(e => {
console.log(e)
})
所以正如你在这里看到的,我使用 promise all 并且它有效:
const all: any = await Promise.all(pageFutures).catch(e => {
console.log(e)
})
但是我注意到它会影响数据库性能,所以我决定一次解决其中的 3 个问题。 为此,我正在考虑不同的方式,例如 cwait、异步池或编写我自己的迭代器 但我对如何做到这一点感到困惑?
例如当我使用 cwait 时:
let promiseQueue = new TaskQueue(Promise,3);
const all=new Promise.map(pageFutures, promiseQueue.wrap(()=>{}));
我不知道在包装内传递什么,所以我现在通过 ()=>{} 加上我得到了
Property 'map' does not exist on type 'PromiseConstructor'.
因此,无论我如何让它工作(我自己的迭代器或任何库),只要我对它有很好的理解,我都可以接受。 如果有人能阐明这一点并帮助我摆脱这种困惑,我将不胜感激?
【问题讨论】:
-
我不确定你想要实现什么。Promise 没有 Map 方法。我认为你将所有值存储在 pageFutures 数组中。所以 pageFutures.Map 是正确的......跨度>
-
@kumaran 我试图遵循 cwait 库指令,但它是如此令人困惑。我所需要的只是一步一步地在 pageFutures 中执行承诺。所以应该先解决 pageFutures 中的 3 个承诺,然后再解决下 3 个 ...
-
@kumaran 如果我按照你所说的 cwait 我得到这个: const all=new pageFutures.map( promiseQueue.wrap(()=>{}));这不是一个有效的选项
-
这里的实际问题是什么?我好像真的说不出来。你能澄清一下你到底想要什么帮助吗?
标签: node.js ecmascript-6 promise es6-promise ecmascript-2016