ForgeTotal.js 5
cs

Total.js 5

Sestavte zpracovatelský řetězec pomocí transforms

Total.js 5 · total5@0.0.19 transformpipeline Spuštěno s Total.js 5

Transform je pojmenovaný řetěz kroků. NEWTRANSFORM(name, fn, [id]) přidá krok do řetězu name; kroky se provádějí v pořadí registrace a každý dostane objekt voleb $ a aktuální hodnotu. Hodnotu změníte přes $.value = ... a zavoláním $.next() pokračujete dalším krokem. $.invalid(message) přidá chybu. TRANSFORM(name, value) řetěz spustí a vrátí promise s konečnou hodnotou; promise se zamítne, když některý krok ohlásil chybu. S callbackem místo toho TRANSFORM(name, value, function(err, value) {}). Název bez jakéhokoli kroku vrátí hodnotu beze změny.

Použijte ho pro práci, kterou je třeba moci rozšiřovat z více míst, například čištění komentáře před uložením: filtr spamu, ořezávač mezer a kontrola odkazů mohou žít každý ve vlastním souboru a dát se přidat či odebrat bez zásahu do kódu, který volá TRANSFORM(). Volitelné id umožňuje krok později odstranit přes NEWTRANSFORM(name, null, id).

definitions/transforms.js
NEWTRANSFORM('comment', function($, value) {
	$.value = value.trim();
	$.next();
}, 'trim');

NEWTRANSFORM('comment', function($, value) {
	if (/spam/i.test(value))
		$.invalid('Spam is not allowed');
	$.next();
}, 'spam');

NEWTRANSFORM('comment', function($, value) {
	$.value = value.replace(/\s+/g, ' ');
	$.next();
}, 'spaces');
controllers/comments.js
exports.install = function() {
	ROUTE('POST /comment/ @json', comment);
	ROUTE('DELETE /comment/spaces/', remove_step);
};

async function comment($) {
	try {
		var text = await TRANSFORM('comment', $.body.text);
		$.json({ text: text });
	} catch (err) {
		$.json({ error: true });
	}
}

function remove_step($) {
	NEWTRANSFORM('comment', null, 'spaces');
	$.success();
}