因为我需要从 dynamoDB 中删除很多项目,所以我编写了 forEach 并调用了 delete item 函数,如下所示,但是它会达到容量限制(这意味着我需要放慢发送查询/删除请求的速度)我的 dynamoDB,我想让它在每次调用之间延迟几秒钟。
arrayOfitems.forEach( item => {
return docClient.delete(params).promise();
});
我尝试使用 npm delay https://www.npmjs.com/package/delay如下所示,但它会在 2 秒后执行,然后仍然执行所有 delete(foreach 循环),而不是等待 2 秒,然后每次都调用 delete。
arrayOfitems.forEach( item => {
delay(2000)
.then(() => {
return docClient.delete(params).promise();
});
});
我听说有人建议使用 Promise.Map 或 P.Map,但在我谷歌之后,我看到了如下示例,我不确定这是否适合我的情况。因为我不使用 Promise.all 或没有 promise 数组,所以我真的不知道如何在我的案例中使用它。谁能有更好的主意来解决这个问题?
const pMap = require('p-map');
const got = require('got');
const sites = [
getWebsiteFromUsername('sindresorhus'), //=> Promise
'ava.li',
'todomvc.com',
'github.com'
];
const mapper = el => got.head(el).then(res => res.requestUrl);
pMap(sites, mapper, {concurrency: 2000}).then(result => {
console.log(result);
//=> ['http://sindresorhus.com/', 'http://ava.li/', 'http://todomvc.com/', 'http://github.com/']
});
最佳答案
听起来您需要做的是构建一个 promise 链,将所有删除与您想要的延迟拼接在一起。这将使您的序列保持同步。你可以这样做:
const delay = time => {
return new Promise((resolve, reject) => {
setTimeout(() => { resolve() }, time)
}
}
// create the start of the promise chain
var chain = Promise.resolve()
// go through each item and append a delay and the work (not sure where you get params from)
arrayOfItems.forEach(item => {
chain = chain.then(() => docClient.delete(params).promise())
.then(() => delay(2000))
})
现在这只是一个未经测试的示例,并且存在诸如在最终删除后添加两秒延迟之类的问题。但你应该明白了。关键是递归地使用最后一个 promise 作为下一个 promise 的起点。
关于javascript - 我如何在 forEach 中使用 set timeout 和 promise/dynamoDB delete?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50281849/