Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Дайте мне этот сайт и я перепишу его на php так, что бы он работал быстрее чем на node.js
var имяКонструктора = function(arg1, arg2, arg3){ // ← набор аргументов (три для примера)
if(!( this instanceof имяКонструктора )){
return new имяКонструктора(arg1, arg2, arg3);
}
// далее следует основное тело конструктора
};
var self = this;
if (!(this instanceof Ctor))
self = new K();
var instance = {}instance.prototype = Ctor.prototype; var ctor = Ctor.apply(instance, arguments);
(function (window) {
var L
, K = function () {}
, document = window.document;
var Constructor1 = function () {
var self;
if (this instanceof Constructor1)
self = this;
else
self = L;
return self;
}
K.prototype = Constructor1.prototype;
L = new K();
Constructor1.prototype.pipe = function (data) {
return data;
}
window.Constructor1 = Constructor1;
})(this);
instanceof (new Constructor1()) === 'Constructor1'; // true
instanceof (Constructor1()) === 'Constructor1'; //false
yield from корутинами стало возможно пользоваться без монстрообразных консктрукций а-ля лишних for и try..except var fs = require('fs');
var readSettings = function( filename, callback ){
fs.readFile( filename, { encoding: 'utf8' }, function( err, data ){
if( err ) {
callback(err); // ← вот так делается передача ошибки!
return;
}
// далее следует обработка прочитанных из файла сведений…
callback( null, обработанныеДанные );
});
};
if( err ) {
callback(err);
return;
}
Как видите, вглубь не передаётся внешний коллбэкЭто у вас пример простой просто, все вызовы на одном экране и в одном и том же замыкании. На практике же вызовы меняют контекст замыкания частенько. Да и явно тащить везде первый аргумент, плюс лишний иф — это я и называю несовершенностью языка в части обработки исключений (непродуманность).
function loadUser(req, res, next) {
if (req.params.userId) {
Users.findOne({ id: req.params.userId }, function(err, user) {
if (err) {
return next(new Error("Couldn't find user: " + err));
}
req.user = user;
next();
});
} else {
next();
}
}
// ...
app.get('/user/:userId', loadUser, function(req, res) {
// do something with req.user
});
app.get('/users/:userId?', loadUser, function(req, res) {
// if req.user was set, it's because userId was specified (and we found the user).
});
// Pretend there's a "loadItem()" which operates similarly, but with itemId.
app.get('/item/:itemId/addTo/:userId', loadItem, loadUser, function(req, res) {
req.user.items.append(req.item.name);
});
function requireAdmin(req, res, next) {
if (!req.user || !req.user.admin) {
return next(new Error("Permission denied."));
}
next();
}
app.get('/top/secret', loadUser, requireAdmin, function(req, res) {
res.send('blahblahblah');
});
Да, именно так это и называется — callback hell. Ошибки, как правило, эскалируются вверх до определенного уровня, и там уже обрабатыва
return callback(err) if err?.if( err ) return callback(err);, если такая запись допустима стандартами кодирования, а не требуется её разворачивать в if( err !== null ) {
callback(err);
return;
}
try {
File::remove($filename);
catch (FileNotExistsException $e) {
Log::write('Config file not exists. Default values using.');
}
, а на js, как я понимаю, придется писать что-то вродеfile.remove(filename, function (err) {
if (err) {
if (err instanceof FileNotExistsError) {
log.write('Config file not exists. Default values using.');
} else {
callback(err);
return;
}
}
,возможно на порядок больше, чем вы могли бы получить, используя PHP, .NET или RoRЭм. В дотнете уже года полтора как есть поддержка удобной (неудобная в виде Begin/EndSmth с колбеками и IAsyncResult была с бородатых времён) асинхронщины в виде async/await, которая позволяет писать код в императивном стиле абсолютно точно не блокирует вызывающий поток, и на тысячи запросов в секунду будет хватать пула из пары десятков потоков. Стек ASP.NET 4.5 и ASP.NET MVC 4.0 этот подход дают с успехом использовать. Единственная проблема — ещё не все ORM и коннекторы к БД это поддерживают.
// present
app.get('/users/', function (req, res, next) {
db.select('users')
.then(function (users) {
return users.toJSON();
})
.then(res.json, next);
});
// future
app.get('/users/', function *(req, res, next) {
try {
var users = yield db.select('users');
res.json(yield users.toJSON());
} catch (e) {
next(e);
}
});
Как java разработчик я не могу понять как написать на языке без строгой статической типизации приложение больше 1000-и строк.Даже будучи 7 лет разработчиком и архитектором C#/.NET (до полного перехода на альтернативные платформы) понимал как — все дело в организации кода, а не в его системе типизации.
Node.js не подходит для типовых веб-проектов