javascript - 我如何在 forEach 中使用 set timeout 和 promise/dynamoDB delete?

标签 javascript amazon-web-services amazon-dynamodb

因为我需要从 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/

相关文章:

javascript - 调用Howler onend()方法的正确方法

javascript - $.when.apply($, someArray) 是做什么的?

javascript - React 中的共享状态也会更新其余组件和当前组件

timestamp - SimpleDB 插入时的时间戳

amazon-web-services - 验证 SNS 消息 SigningCertURL 中给出的证书

python-2.7 - Dynamodb 使用 python boto3 更新项目表达式

amazon-web-services - 创建新项目时,AWS AppSync 将多个子项添加到一个父属性中

amazon-dynamodb - 本地 DynamoDB 客户端,具有 PHPMyAdmin 等 UI

javascript - 使用 Javascript 进行磁盘文本处理

amazon-web-services - 如何从 Lambda 获得对 EFS 的写访问权限?