28.03.2014

JSSDK. config, Emitter, Promise, request.

JSSDK
config Emitter Promise request

config
Работа с конфигами

config

config()

			// Создаем локальный конфиг
			var cfg = config({
				foo: true,
				bar: false,
				num: 7
			});
			// Либо используем глобальный
			config.set("flag", true);
		

config.is(keys)

			cfg.is("foo"); // true
			cfg.is("bar"); // false
			#! cfg.is("!bar"); // true
			#! cfg.is("bar num:7"); // true, num == 7
			#! cfg.is("num:5:10"); // true, т.к. num >= 5 && num <= 10
		

config.get(key, def)

			cfg.get("user"); // [object Object]
			#! cfg.get("user.name"); // "RubaXa"
			#! cfg.get("user.phones"); // [Array]
			#! cfg.get("user.phones.0") // { id: 1, number: ... }
			#! cfg.get("user.phones.0.number") // 79666361666
			#! cfg.get("foo[bar].baz['qux'].123['zzz'].wow", "lol"); // "lol"
		

config.set()

			cfg.set("foo", "bar");
			#! cfg.set("user.name", "RubaXa");
			#! cfg.set("user.phones[0].number", "..");
			#!+ cfg.set({
			   "user.name": "Konstantin",
			   "user.email": "k.lebedev@corp.mail.ru",
			#!- });
		

config.unset()

			cfg.unset("foo");
			#!+ cfg.unset(
				"user.name",
				"unset.phone[0].number",
				"unset.phone[1]"
			#!- );
		

Emitter
«Излуччатель»

Emitter — super fastest

trigger x 10000 Emitter.trigger: 16ms MicroEvent.trigger: 56ms jQuery.trigger: 92ms

Emitter.emit

			Emitter.apply(myObj); // или var emitter = new Emitter;
			#! myObj.on("foo bar", function (a, b){ console.log(a, b); });
			#! myObj.emit("foo", 123); // 123, undefined
			#! myObj.emit("bar", [4, 5]); // 4, 5
			#!+
			myObj.onBaz = function (val){ console.log(val+"!"); };
			#!- myObj.emit("baz", "ok"); // ok!
		

Emitter: методы

Emitter.trigger

			emitter.on("auth", function (evt, arg) {
			#!+	if (!evt.isDefaultPrevented()) {
					evt.preventDefault();
					console.log(evt.type, evt.details, arg);
			#!-	}
			});
			#!+ emitter.trigger({ type: "auth", details: 123 }, "bar");
			#!- // "auth", 123, "bar"
		

Emitter & handleEvent

			var ctrl = {
				handleEvent: function () {
					// some code
				}
			};
			#! emitter.on("foo", ctrl);
		

Promise
«Обещания»

Promise

Это не только polyfill, но и полноценная замена jQuery.Deferred.

			var promise = new Promise(function (resolve, reject) {
				// some code
				resolve(tue);
			});
			#!+ promise.always(function (state) {
				console.log(state);
			#!- });
		

Promise

Это не только polyfill, но и полноценная замена jQuery.Deferred.

			function delay(ms) {
				var dfd = Promise(); // jQuery-style
				setTimeout(function () {
					dfd.resolve();
				}, ms);
				return dfd.promise();
			}
		

Promise

resolve x 10000 Promise: 77ms Native.Promise: 33ms jQuery.Deferred: 497ms

request
ajax/jsop-запросы

request

			request.get("path/to")
				#!+ .always(function (req/**request.Request*/) {
					if (req.isOK()) {
						#!+ // Резльтат ответа сервера
						#!- console.log(req.body);
					}
				#!- })
			;
		

request.Request: свойства

request.Request: свойства

request.Request: методы

request: события

request: пример

			request.get("path/to").done(function (xhr) {
				var body = xhr.body; // ответ сервера
				if (body.user && body.user.id) {
					// some code
				}
			});
		

request: пример

			request.get("path/to").done(function (xhr) {
				var userId = xhr.get("body.user.id");
				if (userId) {
					// some code
				}
			});
		

request: глобальная обработка ошибок

			request.on("error", function (evt, xhr) {
				#!+ if (xhr.is("status:401")) { // нужна авториция
					#!+ return xhr.retry(function () {
						return request.post("auth/user");
					#!- });
				#!- }
			});
			request.post("path/to").always(function (xhr) {
				// some code
			});
		

request: глобальная обработка ошибок

			request.on("error", function (evt, xhr) {
				#!+ if (xhr.is("status:503 status:504")) {
					#!+ return xhr.retry(function (resolve, reject) {
						#!+ // на xhr.retry есть ограничения
						#!- setTimeout(resolve, 7000);
					#!- });
				#!- }
			});
		

request: глобальная обработка ошибок

			request.on("error", function (evt, xhr) {
				if (xhr.is("status:503:504")) {
					return xhr.retry(function (resolve, reject) {
						// на xhr.retry есть ограничения
						setTimeout(resolve, 7000);
					});
				}
			});
		

request.mock

request.mock

request.mock

			request.mock({
				url: "path/to",
				type: "post",
				responseText: ".."
			});
			#! request.mock.one({ url: "path/to", status: 500 });
			#! request.mock.one({ url: "path/to", status: 200 });
		

The End

github.com/RubaXa
@ibnRubaXa