Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
//noinspection JSUnresolvedVariable
var remaining_thread_count = Number(process.env.THREAD_COUNT) || 150;
export async function init() {
...миграции БД...
while (remaining_thread_count--)
/*important! not an async call, that's an fibering*/
start_thread();
}
async function start_thread() {
await (await getNextTask());
start_thread();
}
await (await getNextTask());
function test() {
return new Promise((resolve) => {
resolve(Promise.resolve(5));
});
}
test().then((val) => console.log(val)) // 5
(async function start_thread() {
const result = await getNextTask();
console.log(`got ${result} from promise`);
})();
async function getNextTask(){
return new Promise(resolve => resolve(5))
}
// этот код эквивалентен
log(await (await foo()));
// этому
foo().then(r => r).then(r => log(r));
Object.defineProperty эта задача прекрасно решалась, просто библиотека вместо хеша конструкторов должна возвращать функцию с одним параметром — именем провайдера. Это можно назвать фабрикой конструкторов. Фабрика делает нужный require и выглядит это гораздо лаконичнее.module.exports = function(providerName) {
return require('./'+providerName+'-storage.jsx');
};
var storage = require('storage');
var fsStorage = new storage.FsStorage();
var storageConstructor = require('storage')('fs'),
fsStorage = new storageConstructor();
Object.defineProperty().@constructor, а что @namespace. Использование фабрик требовало бы модернизации сборщика/генератора документации.Object.defineProperty?@constructor, @namespace и остальные.index.js:/** @namespace storage */
/**
* @name storage.FsStorage
* @extends storage.BaseStorage
* @constructor
*/
Function().prototype. /**
* @name storage.getStorage
* @returns {storage.FsStorage|storage.MysqlStorage|storage.MongoStorage}
*/
util.inherits(). /**
* @name storage.MysqlStorage
* @extends {storage.BaseStorage|storage.SqlStorage}
* @constructor
*/
function curry(x) {
return function(y) {
return x + y;
}
}
var res = curry(4)(5); или получать унаследованную функцию var fn = curry(4); и потом var var res = fn(5); С первого взгляда, может быть непонятно, зачем наследовать функции, но таким способом можно реализовывать метапрограммирование (порождающее программирование), см. примеры: habrahabr.ru/post/227753 Там замыкания повсеместно для порождения модификаций используются, и как это скормить в jsdoc? Это же все в рантайме создается.util.inherits(); Это способ классового наследования. Это не имеет ни какого отношения к примесям в прототипы. Примеси в прототипы нужны когда мы хотим, опять же, динамически создать прототип для массового порождения объектов. Например, имеем Client.prototype, и заранее мы не знаем, будет включен или отключен модуль безопасности. Когда он включен, то делается require('security')(Client); И уже сам модуль безопасности примешивает к Client.prototype свои методы, например: Client.prototype.signIn(login, password); и перекрывает своими методами часть базовых, Client же не знал до этого что есть методы модуля безопасности, и он должен так расширить Client, чтобы новые методы объявить и вызывать их из уже имеющихся.curr вы правы. Для корректного понимания IDE можно добавить в комментарий @returns {function}. Ну, а как пользоваться сей конструкцией можно разъяснить в свободной форме в формате markdown в том же комментарии.util.inherits(). Разница лишь в том, что util.inherits(Client, Security) оставит методы и свойства Client, если таковые имеются в Security.var SecurityClient = mixClass(Client, Security);
function mixClass(cl, mx) {
var resClass = function(){};
util.inherits(resClass, mx);
util.inherits(resClass, cl);
return resClass;
}
var SecurityClient = mixClass(Client, Security);
function mixClass(cl, mx) {
var resClass = cl.prototype.constructor;
util.inherits(resClass, mx);
util.inherits(resClass, cl);
return resClass;
}
Node.JS Загрузка модулей по требованию