Я еще использую небольшой хак-обертку для генерации promise(внимание, довольно своеобразное решение, также нет обработчика ошибки для случаев отличных от сигнатуры (err, result)=>{}):
Object.defineProperty(Object.prototype, 'getPromise2', {
value: function (func, args, argCount, argResolve) {
argCount=argCount||1;
argResolve=argResolve||0;
var _this = this;
var f=func===-1?_this:_this[func];
if(!Array.isArray(args))
args = [args];
return new Promise((resolve, reject) => {
var self=this;
if(argCount==2){
f(...args, function (err, res) {
if (err)
reject(err);
//throw(err);
else
resolve(res);
});
}
else{
f(...args, function () {
var result=arguments[argResolve];
resolve(result);
});
}
});
}
});
_asyncCatch(function*(){
var html=yield request.getPromise2('get', {
url: url,
encoding: 'UTF-8',
gzip: true
}, 3, 2, true);
});
console.log(html);
Правда, не во всех случаях такое решение подойдет, но вообще довольно удобно.
Сама статья любопытна, стиль написания позабавил, спасибо.
Что до личного опыта — из всех инструментов для базового парсинга, которые пробовал, пока больше всего понравился NW.js/Electron. Из коробки можно подключить тот же jQuery(а можно и ванильной js'кой) и строить DOM-дерево со всеми последующими плюшками.
За счет контекста ноды легко контачится с Tor'ом, чуть сложнее — с Fiddler(что позволяет делать волшебные штуки вроде распределения списка прокси по каждому запросу либо изменений ответа сервера), из коробки умеет прокси/подмену заголовков(что тоже иногда весьма полезно) и прочие радости жизни. Отличная поддержка ES6 из коробки, все такое. Ну и визуальное отображение результатов/отладки никто не отменял, конечно же(удобно, когда приходится ковырять пакован обфусцированного js).
В теории, вместо переноса вниз можно воткнуть async/defer — http://www.w3schools.com/tags/att_script_defer.asp, http://www.w3schools.com/tags/att_script_async.asp для js. Для css немного сложнее, но можно воспользоваться решениями типа https://github.com/filamentgroup/loadCSS. Это если совсем уж за рекомендациями PageSpeed гоняться.
Угу. Только пишет старший. а читает и правит — младший. Кроме того. окромя дефолтных методов есть еще куча своих функций. каждая из которых может оказаться троянским конем. Каждую в доке проверять — замучаешься. да и времени очень много уходить будет. Вот для таких случаев иммутабельность может оказаться вполне рентабельной.
Нельзя — obsolete, его убрали уже(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/observe).
Object.watch есть еще в Gecko вроде бы(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/watch), но тоже не очень рекомендуется.
При необходимости можно и шимы использовать + эта статья справедлива и для ноды, у которой поддержка ES6 очень даже неплохая(прокси, если не ошибаюсь, должны быть)
Может я не заметил, но еще стоило бы указать про getter/setter в качестве варианта для создания иммутабельных полей объекта(хотя сам объект будет все еще мутабельным):
var obj = {
get youcantmodifyme() {
return 1;
}
}
obj.youcantmodifyme=5;
console.log(obj.youcantmodifyme); //1
obj={};
console.log(obj.youcantmodifyme); //undefined
Для массивов можно провернуть некислой хаковатости трюк(так делать не надо!):
var q=[1,2,3];
var settings={};
for(var i in q){
settings[i]={
value: q[i],
writeable: false
}
}
var p=Object.defineProperties({}, settings); //а затем из Array тырим нужные методы по типу push. P, кстати говоря, Object, а не Array, зато поля немодифицируемые(ну как немодифицируемые - те, что есть, немодифицируемые, новые добавлять можно спокойно).
А самый красивый, пожалуй, способ для ES6(причем и для массивов, хотя и возвращает объект) — Proxy(спасибо stackoverflow за примеры):
var s=[1,2,3];
var arr = new Proxy(s, {
get: function(target, name) {
return target[name];
},
set: function(target, name){
return 1;
}
});
arr.push(1); //[1,2,3]
arr[1]=100; //[1,2,3]
arr[10000]=100000000; //а вот хрен, все еще [1,2,3]
Стесняюсь спросить — а почему все гадают на кофейной гуще? Неужто ни одного любопытного реверсера/исследователя не нашлось? Если подразумеваются телефонные разговоры. то объем трафика на передачу трафика не сложно заметить просто используя снифферы. Если они анализируют звук и передают только ключевики — можно попробовать отследить необычную активность трафика(не в курсе. гоняют ли они еще какие-то данные пассивно или нет). Что до реверса — мало что могу сказать, но тоже странно. что до сих пор не нашлось любопытных. способных хотя бы понять. есть такой функционал или нет.
Правда, не во всех случаях такое решение подойдет, но вообще довольно удобно.
У Promise должен быть описан reject.
Что до личного опыта — из всех инструментов для базового парсинга, которые пробовал, пока больше всего понравился NW.js/Electron. Из коробки можно подключить тот же jQuery(а можно и ванильной js'кой) и строить DOM-дерево со всеми последующими плюшками.
За счет контекста ноды легко контачится с Tor'ом, чуть сложнее — с Fiddler(что позволяет делать волшебные штуки вроде распределения списка прокси по каждому запросу либо изменений ответа сервера), из коробки умеет прокси/подмену заголовков(что тоже иногда весьма полезно) и прочие радости жизни. Отличная поддержка ES6 из коробки, все такое. Ну и визуальное отображение результатов/отладки никто не отменял, конечно же(удобно, когда приходится ковырять пакован обфусцированного js).
Object.watch есть еще в Gecko вроде бы(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/watch), но тоже не очень рекомендуется.
Для массивов можно провернуть некислой хаковатости трюк(так делать не надо!):
А самый красивый, пожалуй, способ для ES6(причем и для массивов, хотя и возвращает объект) — Proxy(спасибо stackoverflow за примеры):
(Оригинал — http://stackoverflow.com/questions/2449182/getter-setter-on-javascript-array).
А вообще, спасибо за статью, познавательно. Про Object.freeze вообще не знал.
Вот без — изящно.