Используйте «Найти» в сочетании с 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
Вы можете написать свой код с помощью 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
, который запускает несколько возвратов обещаний & 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);
})();
Вы можете оптимизировать эти коды и уменьшить дублирование кода. С 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)
Знаете ли вы, что обещания могут быть сделаны последовательно?
val1.then(v1 => return val2).then(v2=> {...})
Вы должны открыть новую вкладку Chromium, а не экземпляр. (Вы только что перепутали понятия?)
И самое главное - вам нужно лучше управлять процессами загрузки. Очередь будет лучшей здесь. Это может быть просто: это гарантирует, что не более n
запущенных процессов или более продвинутых: которое контролирует ресурсы сервера.
Возможно, вам удастся найти какую-то посылку. Если вам ничего не подходит, не забудьте разобраться с ситуацией, когда что-то вылезет, и Node не заметит окончания процесса.
Я использую методы взаимозаменяемо:
Есть также rate-limits
, которые контролируют количество HTTP-вызовов. О конечной точке, о количестве одновременных заказов с IP.