Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Несколько запросов - один callback (https://javascript.ru/forum/jquery/74057-neskolko-zaprosov-odin-callback.html)

Evgeny_Dedov 09.06.2018 11:08

Несколько запросов - один callback
 
Здравствуйте.
Скажите почему не отрабатывает callback когда все запросы успешны.
У меня что крыша поехала, на ровном месте тупняк!
incJS : function(path, clb){
		var length = path.length, deferreds = [], idx = 0. isJS = [];

		for( ; idx < length; idx++ ){
			if( ! isJS[path[idx]]){
				isJS[path[idx]] = true;				
				deferreds.push($.ajax({url:path[idx], dataType:'script', cache:false}));
			}
		}

		$.when.apply(undefined, deferreds).then(function(){
			if(clb && $.isFunction(clb)) clb();
		});
		
	}

       incJS(['1.js','2.js','3.js'], function(){
              console.log('Все запросы выполнены успешно.');
       })

j0hnik 09.06.2018 11:15

вторая строка, точка после нуля? :blink:

Evgeny_Dedov 09.06.2018 11:20

Нет это я сейчас опечатался, у меня там зпт

рони 09.06.2018 11:33

Evgeny_Dedov,
данный скрипт и загружаемые лежат в одной папке?
не критично, но лучше isJS = {}, а не [];

Evgeny_Dedov 09.06.2018 11:40

Нет, но в консоле все запросы указывают на правильные пути, все запросы
успешны 200, в ответе прилетают все скрипты..

рони 09.06.2018 11:41

Evgeny_Dedov,
версия jQuery?

Evgeny_Dedov 09.06.2018 11:44

jquery_v1.10.1

рони 09.06.2018 11:48

Evgeny_Dedov,
замените на 1.12.4 или выше

Evgeny_Dedov 09.06.2018 11:59

Нет к сожалению не помогло..
Отрабатывает с точностью наоборот, первый вызов - тишина, все последующие - callback...

Nexus 09.06.2018 12:05

А так работает?
/**
 * @author  Mikhailov «Nexus» Artem
 * @site    [url]https://vk.com/nexus94[/url]
 */

var require,requirePathPrefix='';
(function(){
	let __loaded_libraries={};
	const getArguments=function(args){
		return (args[0] instanceof Array)?args[0]:[].slice.call(args);
	};
	const get=function(type,args){
		if(!args.length)
			return Promise.resolve();

		return require(
			getArguments(args).map(function(path){
				return {
					type:type,
					src:path
				};
			})
		);
	};
	const Interface={
		js:function(url){
			return get('js',arguments);
		},
		css:function(url){
			return get('css',arguments);
		}
	};

	require=function(){
		if(!arguments.length)
			return Interface;

		const prom=Promise.all(getArguments(arguments).filter(function(path){
			path=(!!path.src&&!!path.type)?path:path.split('#').shift().split('?').shift();//remove hash and get-params

			return (!__loaded_libraries[path] || !!path.src) && ['css','js'].indexOf(
				!!path.type?
					path.type:
					path.split('.').pop().toLowerCase()
			)>-1;
		}).map(function(path){
			return new Promise(function(resolve,reject){
				__loaded_libraries[!!path.src?path.src:path]=true;

				let is_js=(!!path.type?
						path.type:
						path.split('#').shift().split('?').shift().split('.').pop().toLowerCase()
					)==='js',
					file_path=(!!path.src?path.src:path),
					src=((file_path.substr(0,2)==='//' || file_path.indexOf('http')===0)?'':requirePathPrefix)+
						file_path.replace('nocache','nocache='+Math.random()),
					node=document.createElement(is_js?'script':'link'),
					attrs=is_js?{
						type:'text/javascript',
						src:src
					}:{
						type:'text/css',
						href:src,
						rel:'stylesheet'
					};

				for(let i in attrs){
					if(attrs.hasOwnProperty(i))
						node.setAttribute(i,attrs[i]);
				};

				node.onload=resolve;
				node.onerror=reject;
				document.head.appendChild(node);
			});
		}));
		prom.catch(function(){
			alert('Не удалось загрузить файл. Обновите, пожалуйста, страницу.');
		});

		
		return prom;
	}
})();

require(['1.js','2.js','3.js']).then(function(){
	console.log('Все запросы выполнены успешно.');
});

Evgeny_Dedov 09.06.2018 12:10

Хочется понять почему выше указанный код не работает, я понимаю что можно объехать задачу, но что за глюк то?

рони 09.06.2018 12:12

Цитата:

Сообщение от Evgeny_Dedov
но что за глюк то?

всё должно работать

Nexus 09.06.2018 12:24

Evgeny_Dedov, может проблема в контексте?
Попробуйте undefined заменить на "jQuery" или на "$".

Evgeny_Dedov 09.06.2018 12:24

Ну не хочет, я уже и кэш чистил, перезагружал комп, отрабатывает наоборот, при первом вызове - тишина, при втором и следующих - callback

Evgeny_Dedov 09.06.2018 12:27

Цитата:

Сообщение от Nexus (Сообщение 487026)
Evgeny_Dedov, может проблема в контексте?
Попробуйте undefined заменить на "jQuery" или на "$".

Результат то же(

Evgeny_Dedov 09.06.2018 12:56

Я говорю всё наоборот, это нормально? То есть отрабатывает как - см. ниже
$.when.apply(undefined, requests).then(function(){

	    console.log('Всё хреново.');

	}, function(){

	    console.log('Всё ОК.');

	});

Evgeny_Dedov 09.06.2018 14:04

Да это я всё знаю, я говорю почему так всё поменялось и как это исправить? Я второй день хожу вокруг этого детского сада. Что нет на таком популярном форуме гуру всёзнайки)

Evgeny_Dedov 09.06.2018 14:30

Три успешных запроса статус 200.
В консоле:
Request failed: url "/js/admin/content_func.js?_=1528540673657" status "200"

Белый шум 09.06.2018 15:17

https://api.jquery.com/jquery.ajax/#data-types
Цитата:

If script is specified, $.ajax() will execute the JavaScript that is received from the server before passing it on to the success handler as a string.
Наверняка в самом скрипте синтаксическая ошибка...

Evgeny_Dedov 09.06.2018 15:39

Да, действительно дело в скрипте...
Только там не синтаксическая ошибка, а он был настроен на авто запуск функции. Прилетает объект модуля:
WKCMS.CONTENT = (function(){

	var varNameClass = '/admin/content/index/';

	// Публичные методы
	var publicMethod = {
		init : init,
		viewPages : viewPages,
		newPageForm : newPageForm
	}

	function init(){
...
...
...
}

...
...
...
})();
$(function(){
	WKCMS.CONTENT.init();
})

Вот без этих строк работает:
$(function(){
	WKCMS.CONTENT.init();
})


Бля, качеля двухдневная... Спасибо за ответы. И кто нибудь может пояснить данное поведение.

Evgeny_Dedov 09.06.2018 16:10

Там нет парсееррор, Если скрипт добавляется на стр. не ajax'ом


Часовой пояс GMT +3, время: 06:35.