Как запретить выполнение кода до завершения загрузки?



@sortfact333

Я хочу чтобы модели и код поочередно запускались

// Progress
	function onProgress( xhr ) {

		if ( xhr.lengthComputable ) {

			const percentComplete = xhr.loaded / xhr.total * 100;
			console.log( Math.round( percentComplete, 2 ) + '% downloaded' );

		}

	}

	function onError() {

		const message = "Error loading model";
		console.log( message );

	}




	console.log('Start load')
	const loader = new GCodeLoader();
	loader.load( 'models/gcode/benchy.gcode', function ( object ) {

		object.position.set( - 100, - 20, 100 );
		scene.add( object );


	}, onProgress , onError);
	console.log('End load for mode l ')

	loader.load( 'models/gcode/benchy.gcode', function ( object ) {

		object.position.set( - 100, - 20, 100 );
		scene.add( object );


	}, onProgress , onError);


	console.log('End load for mode 2 ')




	console.log('Run animate')
	const animate = function () {
		requestAnimationFrame( animate );
		renderer.render( scene, camera );
	};

	animate();

Как мне правильно это сделать?
Желательно с объяснением.


Решения вопроса 0


Ответы на вопрос 1



@Aleksandr-JS-Developer

Как запретить выполнение кода до завершения загрузки?
Ответ: ставите на загрузку, ждёте окончания загрузки, выполняете код Х после завершения загрузки.

loader.load( 'models/gcode/benchy.gcode', function ( object ) {
  // code
  }, onProgress , onError);
  console.log('End load for mode 2 ')

Так не работает, потому, что любое обращение на сервер — асинхронное.
Это значит, что оно может занять времени от 0 до Х. Это время код продолжает выполнятся дальше, а ваш запрос выпадает из основного потока и // code сработает только после завершения получения ответа (как ошибки, так и удачного). Даже если подключение идёт 0.0000001мс, то код всё равно не станет его ждать и пойдёт выполнятся дальше.

Тут есть два решения:
Выполнять весь нужный код в // code (т. е. в callback-функции), либо сказать программе ждать окончания загрузки (async/await).

Лучше, конечно, сделать через калбеки, чтобы пользователь не видел «зависание» приложения, пока грузятся модели.

Ссылки:
async-await (ru)
callback-функции

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *