Как изолировать выполнение скриптов, чтобы они не мешали друг другу?
Есть такой код, он забирает данные из гугл таблички из кажой вкладки по очереди.
Для этого через document.head.appendChild(script2) в документ одновременно подгружаются три скрипта (по количеству вкладок), котрые тут же выполняются и через по сути JSONP загружаются данные. Но проблема в том, что я не знаю какая вкладка грузится в данный момент, а мне нужно в зависимости от названия вкладки модифицировать заливаемые данные. Код ниже работает случайным образом. Иногда попадает "images это вкладка IMAGES" иногда нет. Нужно, чтобы попадало всегда. <div id="test"></div> <div id="test2"></div> <script> var idfromURL="16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxeOmY"; var sheetsWeNeed =["parts","system","images"]; var dataURL=" "; for (var im=0; im<sheetsWeNeed.length; im++) { dataURL = "https://spreadsheets.google.com/tq?key="+idfromURL+"&sheet="+sheetsWeNeed[im]+"&headers=1"; var script2 = document.createElement('script'); script2.src = dataURL; document.head.appendChild(script2); var arrObjectsGoogle = []; var ii=-1; var google = { visualization: { Query: { setResponse:function setResponse(data){ ii=ii+1; var fields = Object.create(null); for (var il=0; il<data.table.rows.length; il++) { for (var ik=0; ik<data.table.cols.length; ik++) { if(data.table.rows[il].c[ik]!=undefined && data.table.rows[il].c[ik].v!=null ){ document.getElementById('test2').innerHTML=(sheetsWeNeed[ii]+" "+data.table.cols[ik].label +" __ " +data.table.rows[il].c[ik].v) } } } } } } } } </script> |
Цитата:
https://learn.javascript.ru/promise-basics#loadscript Тогда ты сам сможешь управлять их последовательностью выполнения, строя цепочки https://learn.javascript.ru/promise-...mer-loadscript Или используя async/await https://learn.javascript.ru/async-await |
Цитата:
Нашел в старой ветке пример с fetch он вроде как работает, но если делать по первому варианту без fetch, то внутрь гугл фунции невозможно передать что-то (например название вкладки). от fetch нужно как-то избавиться, чтобы можно было запускать скрипт с рабочего стола... <div id="test"></div> <div id="test2"></div> <script> (async function main() { try { var idfromURL="16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxeOmY"; var sheetsWeNeed =["system","parts","goods","images","GD-images"]; var dataURL=" "; for (var im=0; im<sheetsWeNeed.length; im++) { const response = await fetch("https://docs.google.com/spreadsheets/d/16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxeOmY/gviz/tq?sheet="+sheetsWeNeed[im]+"&headers=1"); const text = await response.text(); const getData = new Function(`return new Promise(setResponse => { const google = { visualization: { Query: { setResponse } } }; ${text} })`); const data = await getData(); /* вывод в консоль и на страницу */ //console.log(data.table.cols); for (var il=0; il<data.table.rows.length; il++) { var fields = Object.create(null); for (var ik=0; ik<data.table.cols.length; ik++) { if(data.table.rows[il].c[ik]!=undefined && data.table.rows[il].c[ik].v!=null ){ if(data.table.cols[ik].label=="id"){data.table.cols[ik].label="title"} if(data.table.cols[ik].label=="name"){data.table.cols[ik].label="caption"} if(sheetsWeNeed[im]=="images" || sheetsWeNeed[im]=="GD-images" ){ fields.type="image/jpeg" } if( sheetsWeNeed[im]=="GD-images" ){ data.table.rows[il].c[ik].v="https://drive.google.com/uc?export=download&confirm=no_antivirus&id="+data.table.rows[il].c[ik].v } if(data.table.cols[ik].label=="tags" && sheetsWeNeed[im]=="parts"){data.table.rows[il].c[ik].v=data.table.rows[il].c[ik].v+" $:/TOC"} if(data.table.cols[ik].label=="tags" && sheetsWeNeed[im]=="goods"){data.table.rows[il].c[ik].v=data.table.rows[il].c[ik].v+" $:/Note"} //console.log(currSheet); //fields[data.table.cols[ik].label]=data.table.rows[il].c[ik].v; document.getElementById('test2').innerHTML=(sheetsWeNeed[im]+" "+data.table.cols[ik].label +" __ " +data.table.rows[il].c[ik].v) } //if($tw.browser) {$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getModificationFields(),fields,$tw.wiki.getCreationFields()))}; } } // pre.textContent = JSON.stringify(data, null, " "); }} catch(error) { //pre.textContent = error.message; console.error(error); } })(); </script> |
Цитата:
Ты будешь получать управление "по порядку", а вот порядок уже сможешь определять сам. |
В порядке бреда
<div id="test"></div> <div id="test2"></div> <script> var idfromURL="16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxeOmY"; var sheetsWeNeed =["parts","system","images"]; var dataURL=" "; function loadScript (src) { let scr = document.createElement ('script') scr.src = src; document.head.appendChild(scr) } function response(data, sheet){ ii=ii+1; var fields = Object.create(null); for (var il=0; il<data.table.rows.length; il++) { for (var ik=0; ik<data.table.cols.length; ik++) { if(data.table.rows[il].c[ik]!=undefined && data.table.rows[il].c[ik].v!=null ){ document.getElementById('test2').innerHTML=(sheet+" "+data.table.cols[ik].label +" __ " +data.table.rows[il].c[ik].v) } } } } var google = { visualization: { Query: { setResponse: function (data) { try { let e = new Error() e.data = data; throw e; } catch (e) { let nb = e.stack.indexOf('&sheet=') if (nb>=0) { ne = e.stack.indexOf('&', nb+7) if (ne>=0) { let sheet = e.stack.slice (nb+7, ne) console.log(sheet, e.data) response (e.data, sheet) } } } } } } } for (let im=0; im<sheetsWeNeed.length; im++) { dataURL = "https://spreadsheets.google.com/tq?key="+idfromURL+"&sheet="+sheetsWeNeed[im]+"&headers=1"; var arrObjectsGoogle = []; var ii=-1; loadScript(dataURL) } </script> |
voraa,
спасибо, не знал, что можно получить название листа из url скрипта let nb = e.stack.indexOf('&sheet=') |
Цитата:
когда указан неправильный idfromURL="16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxXXXXX" ничего не происходит а в консоли появляется красная ошибка GET как тут https://heeg.ru/shop2_2.html?id=1gtS...9CQHxLsE#index как эту ошибку вывести в alert. пробовал try-catch ничего не меняется. |
Цитата:
function loadScript (src) { let scr = document.createElement ('script') scr.src = src; scr.onerror = function(){alert('таблица не существует')}; document.head.appendChild(scr) } |
код не работает на айфоне помогите
Помогите пожалуйста код voraa не работает на айфонах
почему понять не могу. Открыл эту тему через iPhone и в окошке с моим кодом (начало темы) появляется текст. у кода voraa остается пустое окошко. Помогите пожалуйста переделать его код. |
А не работает, потому что iPhone считает переменную nb равной - 1 хотя саму строчку для поиска названия листа он видит правильно.
Как его заставить понять? |
Часовой пояс GMT +3, время: 07:39. |