const PARES_CONCURENCY = 10; // сколько вкладок открываем за раз
runURLs([
'https://site.com/url1',
'https://site.com/url2',
'https://site.com/url3',
'https://site.com/url4'
// ...
]).then(() => console.log('Готово!'));
async function runURLs(urls) {
const browser = await puppeteer.launch();
const tasks = urls.map(url => async () => {
const page = await browser.newPage();
await page.goto(url);
// делаем что-то со страницей
await page.close();
});
const queue = tasks.slice(PARES_CONCURENCY)[Symbol.iterator]();
const runNextTask = () => {
const {value, done} = queue.next();
if(done) { return; }
return value().then(runNextTask);
};
await Promise.all(tasks.slice(0, PARES_CONCURENCY).map(task => task().then(runNextTask)));
await browser.close();
}
function parsePath(path) {
return path.split(',').reduce((acc, item) => {
const [key, value] = item.split('=');
switch(key) {
case 'name':
acc.name = value;
break;
case 'f':
case 'g':
acc[key].push(value);
break;
}
return acc;
}, {
name: '',
f: [],
g: []
});
}
function normalizeTree(tree) {
return Object.keys(tree).map(label => {
const item = tree[label];
if(item.id) { return item; }
const children = normalizeTree(item);
const id = `[${children.map(({id}) => id).join(',')}]`;
return {id, label, children};
});
}
function reduceToTree(data) {
return normalizeTree(data.reduce((acc, {path, id}) => {
const {name, f, g} = parsePath(path);
const target = f.reverse().concat(name).reduce((target, label) => {
return target[label] || (target[label] = {});
}, acc);
target.id = id;
target.label = name;
target.g = g;
return acc;
}, {}));
}
console.log(reduceToTree([
{
"path": "name=Tel6,g=tovarov,g=catalog",
"id": "6000",
"name": "Tel6"
},
{
"path": "name=Tel1,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
"id": "1000",
"name": "Tel1"
},
{
"path": "name=Tel2,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
"id": "2000",
"name": "Tel2"
},
{
"path": "name=Tel3,f=Galaxy,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
"id": "3000",
"name": "Tel3"
},
{
"path": "name=Tel4,f=A,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
"id": "4000",
"name": "Tel4"
},
{
"path": "name=Tel5,f=A,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
"id": "5000",
"name": "Tel5"
}
// ...
]));
form = popup.getElementsByTagName('form')[0]
form = popup.querySelector('form')
form = document.getElementById('wpua-edit-13')
function toggleMe() {
// я кажется начинаю понимать ОТ кого придумали typescript...
var a = 0; // если логика подразумевает логический тип, зачем init-значение число?
return function() {
if(a = true) { // это условие всегда будет истинно, независимо от a, в a сохраним значение true
a = false;
} else if (a = false) { // в принципе тоже что и выше, но еще этот код не достижим
a = true;
}
return a;
}
}
var a = toggleMe(); // в a извлекли функцию с замыканием
var b = a(); // в b будет false
console.log(b);
console.log(b); // а второй лог что-то меняет? нет
function toggleMe() {
var a = 0;
return function() {
if(a = true) {
a = false;
} else a = false /* удаляем недостижимый код if (a = false) {
a = true;
} */
return a;
}
}
function toggleMe() {
var a = 0;
return function() {
a = true
a = false;
/* этот if разворачивается однозначно
if(a = true) {
a = false;
} else a = false */
return a;
}
}
function toggleMe() {
var a = 0;
return function() {
return false;
/* незачем это вычислять каждый раз, все и так однозначно
a = true
a = false;
return a; */
}
}
// если вызвать этот код несколько раз:
var a = toggleMe();
var b = a();
console.log(b);
console.log(b);
// то оптимизатор в конце концов сократит его до
console.log(false);
console.log(false);
// а функцию выкинет совсем
function toggleMe() {
var a = false;
return function() {
return a = !a;
};
}
var b = toggleMe();
console.log(b());
console.log(b());
const items = Array.from(
document.getElementsByClassName('cartitem'),
({textContent}) => ({name: textContent})
);
const itemsJSON = JSON.stringify(items);
var arr = [12, '+', 13, '/', 5, '-', 6];
var result = 0;
var op = '';
for(var i = 0; i < arr.length; i++) {
switch(typeof arr[i]) {
case 'string':
op = arr[i];
break;
case 'number':
switch(op) {
case '+':
result += arr[i];
break;
case '-':
result -= arr[i];
break;
case '*':
result *= arr[i];
break;
case '/':
result /= arr[i];
break;
default:
result = arr[i];
break;
}
break;
}
}
console.log(result);
function Calc() {
let v = 0;
const proto = {
add(x) { v += x; },
subtract(x) { v -= x; },
divide(x) { x && (v /= x); },
multiply(x) { v *= x; }
};
const keys = Object.keys(proto);
const ctx = keys.reduce((acc, key) => {
const wrap = x => ((!isNaN(x) && proto[key](Number(x))), wrap);
return ((acc[key] = wrap), acc);
}, {
getResult: () => v,
reset: () => ((v = 0), ctx)
});
keys.forEach(key => Object.assign(ctx[key], ctx));
return ctx;
}
function recursiveRequest(requestData) {
return fetch(
//здесь формируем запрос из requestData
).then(response => response.json()).then(result => {
if(result.isFinal) return result; // тут условие
return recursiveRequest(result.nextRequest); //вызываем следующий запрос
});
}
recursiveRequest({}).then(finalResult => {
//работаем с последним результатом
});