Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.08.2021, 07:00
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 232

Как изолировать выполнение скриптов, чтобы они не мешали друг другу?
Есть такой код, он забирает данные из гугл таблички из кажой вкладки по очереди.

Для этого через 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>
Ответить с цитированием
  #2 (permalink)  
Старый 20.08.2021, 10:21
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,312

Сообщение от sovsem-nub
Код ниже работает случайным образом.
Иногда попадает "images это вкладка IMAGES" иногда нет.
Нужно, чтобы попадало всегда.
Используй промисы...
https://learn.javascript.ru/promise-basics#loadscript

Тогда ты сам сможешь управлять их последовательностью выполнения, строя цепочки
https://learn.javascript.ru/promise-...mer-loadscript

Или используя async/await
https://learn.javascript.ru/async-await
Ответить с цитированием
  #3 (permalink)  
Старый 20.08.2021, 11:01
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 232

Сообщение от ksa Посмотреть сообщение
Используй промисы...
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>
Ответить с цитированием
  #4 (permalink)  
Старый 20.08.2021, 11:07
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,312

Сообщение от sovsem-nub
Мне бы конечно хотелось, чтобы данные залетали одновременно со всех вкладок.
Так не получится.
Ты будешь получать управление "по порядку", а вот порядок уже сможешь определять сам.
Ответить с цитированием
  #5 (permalink)  
Старый 20.08.2021, 18:49
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 1,268

В порядке бреда

<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>
Ответить с цитированием
  #6 (permalink)  
Старый 20.08.2021, 22:02
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 232

voraa,
спасибо, не знал, что можно получить название листа из url скрипта

let nb = e.stack.indexOf('&sheet=')
Ответить с цитированием
  #7 (permalink)  
Старый 09.09.2021, 10:42
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 232

Сообщение от sovsem-nub Посмотреть сообщение
voraa,
спасибо, не знал, что можно получить название листа из url скрипта

let nb = e.stack.indexOf('&sheet=')
подскажите пожалуйста как в хитром скрипте voraa проверить наличие внешнего js.
когда указан неправильный idfromURL="16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxXXXXX"
ничего не происходит
а в консоли появляется красная ошибка GET
как тут https://heeg.ru/shop2_2.html?id=1gtS...9CQHxLsE#index


как эту ошибку вывести в alert. пробовал try-catch ничего не меняется.
Ответить с цитированием
  #8 (permalink)  
Старый 09.09.2021, 13:55
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 232

Сообщение от sovsem-nub Посмотреть сообщение
подскажите пожалуйста как в хитром скрипте voraa проверить наличие внешнего js.
когда указан неправильный 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)
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обработать ошибки отправки формы, чтобы они были видны не в консоли а в Alert? sovsem-nub Элементы интерфейса 3 28.03.2020 20:05
Как зафиксировать кнопки чтобы они оставались на одном месте? mikefromru Элементы интерфейса 5 14.06.2017 23:15
Как на лету в input разделить цифры, чтобы они приняли вид даты? drkrol Общие вопросы Javascript 3 19.04.2017 16:23
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 11:29
подключение скриптов друг к другу ... Arramis Общие вопросы Javascript 8 26.08.2013 19:05