johnny-dreamguns
10/7/2019 - 9:41 AM

Generator

function fakeAjax(url, cb) {
	var fake_responses = {
		file1: 'The first text',
		file2: 'The middle text',
		file3: 'The last text'
	};
	var randomDelay = (Math.round(Math.random() * 1e4) % 8000) + 1000;

	console.log('Requesting: ' + url);

	setTimeout(function() {
		cb(fake_responses[url]);
	}, randomDelay);
}

function output(text) {
	console.log(text);
}

const getFile = file => new Promise(resolve => fakeAjax(file, resolve));

function* getFiles() {
	const p1 = getFile('file1');
	const p2 = getFile('file2');
	const p3 = getFile('file3');

	output(yield p1);
	output(yield p2);
	output(yield p3);
	output('Completed');
}

const runner = genFn => {
	const itr = genFn();

	const run = arg => {
		let result = itr.next(arg);

		if (result.done) {
			return result.value;
		} else {
			return Promise.resolve(result.value).then(run);
		}
	};

	return run();
};

runner(getFiles);