Javascript 如何使用promise/dynamoDB delete在forEach内部设置超时?

Javascript 如何使用promise/dynamoDB delete在forEach内部设置超时?,javascript,amazon-web-services,amazon-dynamodb,Javascript,Amazon Web Services,Amazon Dynamodb,由于我需要从dynamoDB中删除很多项,所以我在里面编写了forEach并调用delete item函数,如下所示,但是它会达到dynamoDB的容量限制(这意味着我需要放慢速度来发送查询/删除请求),我想让它在每次调用之间延迟几秒钟 arrayOfitems.forEach( item => { return docClient.delete(params).promise(); }); 我尝试使用npm延迟,如下所示,但它会在2秒后执

由于我需要从dynamoDB中删除很多项,所以我在里面编写了forEach并调用delete item函数,如下所示,但是它会达到dynamoDB的容量限制(这意味着我需要放慢速度来发送查询/删除请求),我想让它在每次调用之间延迟几秒钟

arrayOfitems.forEach( item => {
   return docClient.delete(params).promise();                     
});
我尝试使用npm延迟,如下所示,但它会在2秒后执行,然后仍然执行所有的delete(foreach循环),而不是等待2秒并每次调用delete

arrayOfitems.forEach( item => {
    delay(2000)
    .then(() => {
         return docClient.delete(params).promise(); 
    });
});
我听到一些人建议使用Promise.Map或p.Map,但在我搜索它之后,我看到了如下示例,我不确定这是否适合我的情况。由于我不使用Promise.all或Promise数组,我真的不知道如何在我的情况下使用它。有谁能想出更好的办法来解决这个问题吗

constpmap=require('p-map');
const-got=require('got');
常数站点=[
getWebsiteFromUsername('sindresorhus'),//=>Promise
“艾娃·李”,
"todomvc.com",,
“github.com”
];
const mapper=el=>got.head(el).then(res=>res.requestUrl);
pMap(站点,映射程序,{concurrency:2000})。然后(结果=>{
控制台日志(结果);
//=> ['http://sindresorhus.com/', 'http://ava.li/', 'http://todomvc.com/', 'http://github.com/']

});像这样的东西可能行得通吗?每次将超时时间增加2秒,以确保不会在两秒后同时触发所有请求

let timeout = 0
arrayOfitems.forEach( item => {
  timeout += 2000
  setTimeout(() => {
    docClient.delete(params).promise();
  }, timeout)
});

或者,您可以查看批量删除。希望DynamoDB支持一次删除多个项目。我不确定。

听起来你需要做的是建立一个承诺链,将你所有的删除与你想要的延迟连接起来。这将使您的序列保持同步。你可以这样做:

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))
})
现在,这只是一个未经测试的示例,并且存在一些问题,例如在最终删除后增加了两秒钟的延迟。但是你应该明白。关键是递归地使用最后一个承诺作为下一个承诺的起点