6. Блокирование (blocking)
var xhr = new XMLHttpRequest();
xhr.open("GET", "/данные", false);
xhr.onreadystatechange = function(){
console.log("данные:", xhr.status);
};
xhr.send();
// немедленная блокировка, после которой в этом же фрейме Event Loop будет вызван //
onreadystatechange
7. Блокирование (blocking)
var cx = 10, xhr = new XMLHttpRequest();
xhr.open("GET", "/данные", false);
xhr.onreadystatechange = function(){
console.log("данные: ", xhr.status, " значение cx: ", cx);
};
cx = 20;
xhr.send();
cx = 30;
Выведет:
данные: 200 значение cx: 20
8. Блокирование (blocking)
сервер очнулся и
запрос получили ответ
ответил
ожидание ожидание
(ui заблокирован) (ui заблокирован)
9. Не блокирование (Non-blocking)
var cx = 10, xhr = new XMLHttpRequest();
xhr.open("GET", "/данные", true);
xhr.onreadystatechange = function(){
console.log("данные: ", xhr.status, " значение cx: ", cx);
};
cx = 20;
xhr.send();
cx = 30;
Выведет:
данные: 200 значение cx: 30
То есть onreadystatechange не будет выполняться в том же фрейме Event Loop, что и
его определение.
10. Не блокирование (Non-blocking)
сервер очнулся и получили ответ,
запрос
ответил вызвали callback
ожидание
но js может делать все что ожидание
хочет пока в очередном но js может делать все что
фрейме не появится хочет пока в очередном
сообщение о том что фрейме не появится
пришел ответ. сообщение о том что
ui также восприимчив к пришел ответ.
действиям пользователя ui также восприимчив к
действиям пользователя
14. Events
function callback() {
console.log("wow");
}
var events = new Events();
events.on("wow", callback);
// ...
events.trigger("wow");
>>> "wow"
events.off("wow", callback);
events.trigger("wow");
>>>""
15. Events
function doSomething(){
this.events = ['success', 'failure'];
};
doSomething.prototype = new Events();
doSomething.prototype.start = function(){
var that = this;
setInterval( function(){
that.trigger(that.events[ Math.round(Math.random()) ]);
}, 2000 );
}
var process = new doSomething;
process.on("success", function(){
console.log("success");
}).on("failure", function(){
console.log("failure");
});
process.start();
>>>success
>>>success
>>>failure
>>>failure
>>>success
...
16. Promises
function onPromise(){
this.isFulfilled = false;
this.isRejected = false;
this.isResolved = false;
this.result = null;
}
Promise.prototype={
then: function( fulfilled, rejected, progressed ){ ... }
}
// обещанное событие, обещанный триггер
// меняет свое состояние только один раз
// в отличие от событий, которые могут повторяться
http://wiki.commonjs.org/wiki/Promises/A
19. Deferred
var fn = function() {
var dfd = new Deferred(); // наш объект
var promises = [];
promises.push( async1() ); // асинхронная операция раз
promises.push( async2() ); // асинхронная операция два
promises.push( sync1() ); // синхронная операция раз
promises.push( async3() ); // асинхронная операция три
// хотим сделать что-нибудь когда они закончатся
when(promises).done(function() {
dfd.resolve(true);
}).fail(function(err) {
dfd.reject(err);
});
return dfd.promise();
};
var promise = fn();
promise.then( ... );
20. WebWorkers
// master
var worker = new Worker('я.js');
worker.addEventListener('message', function(e) {
console.log('Саша:' + e.data);
});
worker.postMessage( 'апельсины' );
worker.postMessage( 'мандарины' );
// worker (я.js)
self.addEventListener('message', function(e) {
self.postMessage('Я люблю ' + e.data + '!!!');
});
// используем для длительных вычислений
// когда они не трогают DOM
// например переводим книги :)
// часть HTML5
// когда передаем объекты, они клонируются..
21. Node Cluster
//script.js
var cluster = require('cluster');
if (cluster.isMaster) {
// плодим воркеры
var coreCount = require('os').cpus().length;
for (var i = 0; i < coreCount; i++) {
cluster.fork();
}
// слушаем смерть..
cluster.on('death', function(worker) {
console.log('Воркер ' + worker.pid + ' умер');
});
} else {
// умираем если мы воркер
process.exit();
}
>>> node script.js
Воркер 14230 умер
Воркер 14232 умер
Воркер 14229 умер
Воркер 14221 умер