Как ограничить количество звонков в Express.js?

Используйте «Найти» в сочетании с Load для явной загрузки связанных объектов. Ниже примера MSDN:

using (var context = new BloggingContext()) 
{ 
  var post = context.Posts.Find(2); 

  // Load the blog related to a given post 
  context.Entry(post).Reference(p => p.Blog).Load(); 

  // Load the blog related to a given post using a string  
  context.Entry(post).Reference("Blog").Load(); 

  var blog = context.Blogs.Find(1); 

  // Load the posts related to a given blog 
  context.Entry(blog).Collection(p => p.Posts).Load(); 

  // Load the posts related to a given blog  
  // using a string to specify the relationship 
  context.Entry(blog).Collection("Posts").Load(); 
}

здесь ссылка MSDN

0
задан AdriánT95 29 March 2019 в 12:15
поделиться

2 ответа

async await

Вы можете написать свой код с помощью async await. Самое интересное, что вы можете обрабатывать все ошибки, а значение автоматически возвращается с обещаниями.

app.get('/getResults', async function(req, res, next) { //<-- notice the async here
 try{
  const val1 = await scraper.getPrice(results, url, nights)
  const val2 = await scraper.getPrice(results, url, nights)
  const val3 = await scraper.getPrice(results, url, nights)
  const val4 = await scraper.getPrice(results, url, nights)
  return res.send([val1, val2, val3, val4])
 } catch(err) {
   res.status(500).send(err)
 }
})

p-limit

Вы можете использовать пакет с именем p-limit, который запускает несколько возвратов обещаний & amp; асинхронные функции с ограниченным параллелизмом.

const pLimit = require('p-limit');

const limit = pLimit(1);

const input = [
    limit(() => scraper.getPrice(results, url, nights)),
    limit(() => scraper.getPrice(results, url, nights)),
    limit(() => scraper.getPrice(results, url, nights))
];

(async () => {
    // Only one promise is run at once
    const result = await Promise.all(input);
    console.log(result);
})();

for..of loop

Вы можете оптимизировать эти коды и уменьшить дублирование кода. С async..await и for..of вы можете уменьшить код еще больше,

// assuming you have these urls
const urls = [
 'http://example.com', 'http://example.com',  'http://example.com'
];

const results = []
for(let url of urls){
  const data = await scraper.getPrice(results, url, nights);
  results.push(data)
}
console.log(results)
0
ответ дан Md. Abu Taher 29 March 2019 в 12:15
поделиться

Знаете ли вы, что обещания могут быть сделаны последовательно?

val1.then(v1 => return val2).then(v2=> {...})

Вы должны открыть новую вкладку Chromium, а не экземпляр. (Вы только что перепутали понятия?)

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

Возможно, вам удастся найти какую-то посылку. Если вам ничего не подходит, не забудьте разобраться с ситуацией, когда что-то вылезет, и Node не заметит окончания процесса.

Я использую методы взаимозаменяемо:

  • помечает URL как загруженный, и если он не извлекается в течение определенного времени, он возвращается в очередь (более конкретно: укажите, когда повторно загружать URL . Во время загрузки это +1 минута, после загрузки это, например, 1 месяц)
  • Я сохраняю PID процесса загрузки и периодически проверяю, работает ли он

Есть также rate-limits, которые контролируют количество HTTP-вызовов. О конечной точке, о количестве одновременных заказов с IP.

0
ответ дан bato3 29 March 2019 в 12:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: