Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.03.2018, 00:00
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Fetch :: Stream
Начал изучать стримы и напоролся на интересный момент: если мы из fetch передаем в стрим response.body.getReader() то больше мы не можем использовать ни .text() ни json(). Свойство locked только read only.

Пытался Object.Assign, но ответ сервера тупо не копируется, хотя пишет что typeof object.

Нужно было сделать индикатор загрузки и напоролся на то что стрим отдает Unit8Array чанками, который нахрен не нужен.

Можно конечно коллектить чанки и потом клеить, но как вернуть больше 65xxx символов длины?

Вот... Есть идеи как обойтись одним потоком? Может как-то unit8array конвертировать? Сделал как-то неправильно и грузит в два потока, а например у GitHub полоска индикатора интереснее ....

Листинг:

var u = args[0] || null;
		var m = args[1] || 'GET';
		var d = args[2] || 'text';

		var b = args[3] || null; 
		var f = args[4] || null;

		// define what index of argument shold be used for callback
		let callback = f ? f : b;
		let headers = new Headers();

		headers.append('X-Revolver', this.appVer);

		let reqInit = { 
				method: m,
				headers: headers,
				cache: 'default',
				credentials: 'same-origin',
				mode: 'same-origin',
				redirect: 'follow',
				referrer: 'client'
		};

		if( m === 'POST' || m === 'PUT' && args[4] ) {
			reqInit.body = b;
		}

		/* stream response */
		function consume(reader, max) {

			let total = 0;

			return new Promise((resolve, reject) => {

				function pump() {
					
					reader.read().then(({done, value}) => {
						
						if(done) {
							
							RR.screenPosition(0.4, 1, true);

							setTimeout(function(){
								RR.screenPosition(0.7, 1, true);
							}, 700);

							setTimeout(function(){
								RR.screenPosition(1, 1, true);
							}, 800);

							resolve();
							return;
						}


						total += value.byteLength;

						RR.screenPosition(total, max, true);

						pump();

					}).catch(reject);

			}

			pump();

			});
		}


		const request = new Request(u, reqInit);
		
		// indicate process loading
		fetch(request).then(function(r) {
			if(r.ok) consume(r.body.getReader(), r.headers.get("Content-Length"));
		}).then(function(k) { });

		// real data loading
		fetch(request).then(function(r) {
			
			if(r.ok) {

				let result;

				switch(d) {
					default:
					case 'text': result = r.text();
						break;
					case 'json': result = r.json();
						break;
				}

				return result;
			}

		}).then(function(k) {

			if( d === 'html' ) {
				// revert from [string] to [object html]
				const pattern = /<body[^>]*>((.|[\n\r])*)<\/body>/im;
				k = RR.convertSTRToHTML(pattern.exec(k)[0]);
			}

			if( k ) callback.call( k );

		});
Ответить с цитированием
  #2 (permalink)  
Старый 03.03.2018, 00:12
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Если это нужно только для полоски загрузки - хватит банального xmlhttp, и не надо будет городить огород.)
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 03.03.2018, 08:56
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Хочется именно на fetch.
Ответить с цитированием
  #4 (permalink)  
Старый 03.03.2018, 13:55
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Цитата:
- Надо забить гвоздь - микроскопом как-то сложно выходит, подскажите как лучше?
- Попробуйте молотком.
- Нет, хочется именно микроскопом.
Ну тогда возись с преобразованиями. *пожал плечами*
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 03.03.2018, 14:10
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Я думал, кто хитрее подскажет способ, но видимо не вариант. Спасибо
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не отображаются данные. fetch phoenix200689 Библиотеки/Тулкиты/Фреймворки 0 17.12.2017 23:43
Авторизация в ВК с помощью fetch() caseyryan Общие вопросы Javascript 1 29.06.2017 10:38
video stream cyber Node.JS 2 23.03.2015 15:39
После fetch на выходе Array, а не Collection _sky_ Backbone.js 2 06.02.2015 18:22
backbone.js: fetch запрос только по нужным атрибутам модели yerzhik Библиотеки/Тулкиты/Фреймворки 1 09.06.2013 19:32