Async.auto – asynchronní magie

O řízení programu pomocí asynchronní knihovny async jsem již psal na webu nodejs.cz, zde bych však chtěl vypíchnout především jednu speciální funkci, která doopravdy stojí za to! Pomocí ní totiž můžeme zadat seznam funkcí, které se provedou paralelně a na konci si pak jen vybrat výsledek.

Je to funkce async.auto, které stačí dát seznam funkcí a na konci nám vyplivne Object obsahující jejich výsledky. Pojďme si ukázat pár příkladů:

 

Základní použití:

var async = require("async");
var CONFIG = { /* ... */ }

function getDBConfig(next) {
		
	// nacte vsechny polozky v tabulce config
	DB.config.find(next);
}

function getLocalConfig(next) {
		
	// v callbacku vrati lokalni konfiguraci
	next(null, CONFIG);
}

async.auto({
	configDB: getDBConfig,
	configLocal: getLocalConfig,
}, funtion(err, data) {
	
	/**
	* Promenna data ma nyni nasledujici strukturu
	*    data = {
	* 	configDB: ... // konfigurace nactena z DB
	* 	configLocal: ... // lokalni konfigurace
	*  }
	*/
});

Což se díky uniformnímu stylu volání funkcí v nodu (error je téměř vždy jako první parametr) dá zkrátit i na toto:

var async = require("async");
var CONFIG = { /* ... */ }

function getLocalConfig(next) {
		
	// v callbacku vrati lokalni konfiguraci
	next(null, CONFIG);
}

async.auto({
	configDB: DB.config.find,
	configLocal: getLocalConfig,
}, funtion(err, data) {
	// zpracovani vysledku
});

Celkem triviální použití funkce async.auto. První parametr udává seznam funkcí, které se mají provést, v druhém je pak callback funkce, která se zavolá po jejich dokončení. Pokud vše proběhlo v pořádku, callback obdrží jako první parametr null, pokud některá z funkcí vrátila chybu, asynchronní zpracování dalších funkcí se ukončí a callback funkce dostane v prvním parametru poslanou chybu. Druhý parametr pak obsahuje výsledky z jednotlivých funkcí, které jsou indexovány stejně, jako vstupní seznam.

Za zmínku stojí také fakt, že knihovna async volaným funkcím předává v parametrech callback funkci (u nás nazvaná next), která se musí zavolat po ukončení výpočtu a jako své parametry bere error (zda nějaký byl) a výsledek funkce – viz příklad s funkcí getLocalConfig.

 

Správa závislostí pomocí async.auto:

V příkladu výše nám nezáleží na tom, která z funkcí se provede dříve, v některých případěch však již potřebujeme řídit zpracování asynchronních procesů. Při ukládání dat do cache určitě nechceme, abychom data ukládali ještě dříve, než je načteme z databáze. Je tedy potřeba některé části synchronizovat. I na to můžeme použít async.auto, což ukazuje následující příklad:

var async = require("async");

function getDataFromDatabase(next) {
	
	// nacteni dat - napriklad seznam nejlepsich clanku
	DB.posts.find({best: 1}, next);
}

function cacheData(next, partialData) {
	
	Cache.save("best_posts", partialData.posts, next);
}

function doSomethingOther(next) {
	
	for(var i = 0; i < 10; i++) {
		console.log("Asynchronní operace.. ", i);
	}
		
	next(null, i);
}
	
async.auto({
	dbResult: getDataFromDatabase,
	cacheResult: ["dbResult", cacheData],
	somethingOther: doSomethingOther,
}, funtion(err, data) {
	
	// dalsi zpracovani
});

Pro uložení dat do cache  pomocí cacheData zde předáváme v poli také seznam prerekvizit, na kterých naše funkce závisí. Funkce cacheData se tak zavolá až po načtení infa o kategorii a jako bonus dostane částečné pole výsledků obsahující data z předchozích funkcí. Ostatní funkce se volají nezávisle na ostatních.

Tato funkce nebo spíše celá knihovna je jednou z mnoha perlí, které se mi na nodu líbí. Async obsahuje spoustu dalších nástrojů pro práci s asynchronním zpracováním, takže doporučuji kouknout i na oficiální info.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *