Я пытаюсь запустить сценарий селена в l oop для заполнения базы данных. У меня есть массив объектов с 57 позициями, и мне нужно l oop через каждый из них. Как мне сделать это в l oop, сохраняя его асинхронным? Я в основном хочу, чтобы l oop через каждый магазин проверял статус и сохранял в базу данных. Теперь проблема в том, что когда я запускаю его в l oop, он запускает асинхронный код в синхронном l oop, поэтому это проблема, потому что он не ждет, пока одна задача не завершится sh, и запускается другой.
Это одна часть моего массива. Представлена в коде как магазины.
module.exports = [{ id: '1031', store: 'CANNES - LA BOCCA' },
{ id: '1009', store: 'ST ANDRÉ-LES-VERGERS' },
{ id: '1046', store: 'MARSEILLE ST MENET' },
{ id: '1071', store: 'MARIGNANE' },
{ id: '1020', store: 'IFS' },
{ id: '1032', store: 'CORMEILLES-EN-PARISIS' },
{ id: '1044', store: 'CERGY' },
{ id: '1055', store: 'HERBLAY' }];
Вот мой код
const chromeOptions = new chrome.Options().addArguments('disable-infobars', 'headless');
const chromeDesktop = {
prefs: {
profile: {
default_content_settings: {
images: 2,
},
managed_default_content_settings: {
images: 2,
},
},
},
};
const driver = new webdriver.Builder()
.withCapabilities(chromeDesktop)
.forBrowser('chrome')
.setChromeOptions(chromeOptions)
.build();
for (let index = 0; index < Stores.length; index++) {
(async function getStores(index) {
setTimeout(async () => {
try {
await driver.get('https://www.chronodrive.com');
await driver.manage().addCookie({
name: 'chronoShop',
value: `"shopId=${Stores[index].id}"`,
});
await driver.get('https://www.chronodrive.com');
await driver.wait(webdriver.until.elementLocated(webdriver.By.id('layer-overlay')), 4000);
await driver.executeScript('document.querySelector(\'#layer-overlay\').style.display = \'none\'');
await driver.executeScript('document.querySelector(\'#layer-wrapper\').style.visibility = \'hidden\'');
const text = await driver.findElement(webdriver.By.className('dispo--empty')).getText();
if (text.length > 30) {
const objA = {
store: Stores[index].store,
dispo: text,
id: Stores[index].id,
lastChecked: new Date(),
};
await Store.create(objA);
console.log(text);
} else {
const objB = {
store: Stores[index].store,
dispo: `*** Pas de disponibilité dans magasin de ${Stores[index].store} ***`,
id: Stores[index].id,
lastChecked: new Date(),
};
await Store.create(objB);
console.log(`*** Pas de disponibilité dans magasin de ${Stores[index].store} ***`);
}
} finally {
await driver.quit()
}
}, 1000 * index);
}(index));
}
Я использовал для функции тайм-аута временного решения, но это не является реальным решением, так как есть много факторов, которые могут повлиять на функцию.
Я читал, что могу как-то использовать функцию map и Promise.all (), но как Я делаю это? Должен ли я выполнить Promise.all () для каждой ожидающей строки кода? Кажется, это неэффективно, и писать задницу было бы больно.
Спасибо