Как использовать установленное время ожидания внутри forEach с обещанием / удаление DynamoDB? - PullRequest
0 голосов
/ 11 мая 2018

Так как мне нужно удалить много элементов из DynamoDB, я пишу для forEach и вызываю функцию удаления элемента внутри, как показано ниже, но это достигнет предела емкости (это означает, что мне нужно замедлить, чтобы отправить запрос / запрос на удаление) измой DynamoDB, и я хочу, чтобы он задерживал несколько секунд между каждым вызовом.

arrayOfitems.forEach( item => {
   return docClient.delete(params).promise();                     
});

Я попытался использовать задержку npm https://www.npmjs.com/package/delay, как показано ниже, но он будет выполнен через 2 секунды, затем все равно выполнит все удаление (цикл foreach) вместо ожидания 2 секунд и вызоветудалять каждый раз.

arrayOfitems.forEach( item => {
    delay(2000)
    .then(() => {
         return docClient.delete(params).promise(); 
    });
});

Я слышал, что некоторые люди предлагают использовать Promise.Map или P.Map, но после того, как я их Google, я увидел пример, как показано ниже, и я не уверен, если этоподходит в моем случае.Поскольку я не использую Promise.all или у меня есть множество обещаний, я не знаю, как использовать это в моем случае.Может ли кто-нибудь иметь лучшую идею, чтобы решить эту проблему?

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/']
});

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Похоже, что вам нужно сделать, это построить цепочку обещаний всех ваших удалений с добавлением желаемых задержек. Это будет поддерживать вашу последовательность синхронно. Вы могли бы сделать что-то вроде этого:

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))
})

Теперь это просто непроверенный пример, и он имеет такие проблемы, как добавление двухсекундной задержки после окончательного удаления. Но вы должны понять. Ключ рекурсивно использует последнее обещание в качестве отправной точки следующего обещания.

0 голосов
/ 11 мая 2018

Может быть, что-то подобное будет работать?Увеличивайте тайм-аут на 2 секунды каждый раз, чтобы гарантировать, что запросы не будут запущены в одно и то же время через две секунды.

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

В качестве альтернативы вы можете посмотреть на удаление пакетов.Надеюсь, DynamoDB поддерживает удаление нескольких элементов одновременно.Я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...