@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();


Как мне правильно это сделать?
Желательно с объяснением.
  • Вопрос задан
  • 235 просмотров
Пригласить эксперта
Ответы на вопрос 1
Aleksandr-JS-Developer
@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-функции
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы