Pull to refresh
11
0
Send message
Я еще использую небольшой хак-обертку для генерации 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);


Правда, не во всех случаях такое решение подойдет, но вообще довольно удобно.
С использованием генераторов(либо будущего async/await) можно писать код в синхронном стиле. Обычно использую что-то в таком духе:

_asyncCatch(function*(){
     try{
        var a1=yield promise1();
        var a2=yield promise2();
        var a3=yield promise3();
     } 
     catch(ex){
       console.log(ex);
     }
}


У Promise должен быть описан reject.
Если девушка не из MMORPG и вы виделись вживую, эксперимент не засчитан.
Сама статья любопытна, стиль написания позабавил, спасибо.
Что до личного опыта — из всех инструментов для базового парсинга, которые пробовал, пока больше всего понравился 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 гоняться.
Угу. Только пишет старший. а читает и правит — младший. Кроме того. окромя дефолтных методов есть еще куча своих функций. каждая из которых может оказаться троянским конем. Каждую в доке проверять — замучаешься. да и времени очень много уходить будет. Вот для таких случаев иммутабельность может оказаться вполне рентабельной.
По поводу //immutable — как это убережет от ошибки с неявными изменениями массива, указанной в статье(тот же sort/splice/delete/что-там-еще)?
Да, справедливо.
Нельзя — 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), но тоже не очень рекомендуется.
Гугля дает https://github.com/tvcutsem/harmony-reflect. Насколько работоспособно — не в курсе, пока проверить не могу.
При необходимости можно и шимы использовать + эта статья справедлива и для ноды, у которой поддержка 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]


(Оригинал — http://stackoverflow.com/questions/2449182/getter-setter-on-javascript-array).

А вообще, спасибо за статью, познавательно. Про Object.freeze вообще не знал.
Вот это рекурсия!
Стесняюсь спросить — а почему все гадают на кофейной гуще? Неужто ни одного любопытного реверсера/исследователя не нашлось? Если подразумеваются телефонные разговоры. то объем трафика на передачу трафика не сложно заметить просто используя снифферы. Если они анализируют звук и передают только ключевики — можно попробовать отследить необычную активность трафика(не в курсе. гоняют ли они еще какие-то данные пассивно или нет). Что до реверса — мало что могу сказать, но тоже странно. что до сих пор не нашлось любопытных. способных хотя бы понять. есть такой функционал или нет.
C 1 if'ом можно вообще без хитрых алгоритмов:

var test=(e)=>{
	var q={
		3: 'fizz',
		5: 'buzz',
		15: 'fizzbuzz'
	};

	var result=e;
	for(var i in q){
	   if(e%i==0){
		 result=q[i];
	   }
	}
	return result;
};

var t=[];
for(var i=0; i<100; i++) t.push(test(i));
console.log(t.join(' '))


Вот без — изящно.
А вывод простой: хочешь провалить интервью — покажи интервьюеру, что он ламер.
Кстати, а есть ли возможность переопределения операторов?

Information

Rating
Does not participate
Registered
Activity