8.30.2016

Для чего нужен TypeScript

Совсем недавно познакомился с TypeScript на курсах. Язык оставил приятное впечатления и теперь я с удовольствием углубляю свои знания языка и пользуюсь им в работе.

В данной заметке решил под итожить в целом для чего нужен TypeScript.

TypeScript компилируется в JavaScript и в общем синтаксически очень похож на JavaScript в его текущем стандарте ES6. Если исключить из TypeScript все новшества ES6, такие как функции-стрелки, promise и т.д. то у нас останется лишь то, что TypeScript позволяет нам описывать типы переменных.

Например, так:
let num: number;
num = 2;

На самом деле, конечно же, описываются не переменные, а типы данных. TypeScript дает возможность описывать больше типов данных чем существует в JavaScript.

В TypeScript появляются такие типы данных как Кортежи (Tuple), Перечисления (Enum), Обобщенные типы <T> и некоторые "плюшки" (назовем их так) которые позволяют работать с описанием типов (если коротко то есть конфигурационные файлы, есть файлы описания типов, есть синтаксис подключения файлов с описанием типов и т.д. ). 

Кстати, Class тоже является типом данных, он так же как и все остальные типы данных призван выразить, описать, передать идеи, концепции, мысли программиста. Другими словами типы данных, это инструменты выразительного искусства под названием программирование. И в этом отношении TypeScript конечно превосходит JavaScript. Так как дает нам больше средств выражения, способов передачи смысла программы, благодаря чему TypeScript и принято использовать в больших приложениях.

Получается одинаково грамотно написанный код на TypeScript будет легче понять чем такой же на JavaScript. Можно сказать, что код на TypeScript имеет большее разрешение и детальнее описывает программу, не говоря о предотвращении ряда ошибок на этапе компиляции.

К слову говоря TypeScript обладает хорошей документацией, хоть и на английском, и средой выполнения кода в браузере. Все тут http://www.typescriptlang.org/docs/handbook/basic-types.html

8.25.2016

Асинхронный бесконечный цикл на NodeJS

Всем привет. Решил сделать небольшую памятку по следам недавних событий. 

Живой пример: https://jsfiddle.net/popy8apd/

Неделю назад мой коллега решил сделать парсер поисковой выдачи на NodeJS и selenium, натолкнулся на трудности работы с асинхронным кодом, "плюнул" и написал на Python. 

А проблема заключалась вот в чем. Он пытался, по старой PHP привычке, писать код в синхронном стиле. Выполнял поисковой запрос в google потом запускал цикл for и на каждой итерации собирал ссылки с первой страницы поиска, на второй итерации на второй странице и так далее. 

Все было бы прекрасно за исключением того, что переход на следующую страницу поиска событие асинхронное и выполнится оно только после текущего js кода. А это значит, что цикл не будет ждать пока мы перейдем на следующую страницу поиска. Он просто прогонит весь цикл (весь текущий js) потом вызовет C++ код который выполнит переход на следующую страницу выдачи и когда закончит вызовет соответствующие обработчики в js.

Решил набросать небольшое решение данной задачи. Для этого понадобится генератор, который будет запускать асинхронный код и ждать от него ответа. Когда ответ придет генератор проверит нужно ли прервать цикл. Если нет, то выполнит следующую итерацию цикла.

Пусть переход на новую страницу выдачи занимает секунду и еще две секунды занимает сохранение результатов в базу (ну чтоб было заметнее).

Пример на jsfiddle => https://jsfiddle.net/popy8apd/

function* generateSequence() {
    for (let i = 0; i < 5; i++) { //
for (let i = 0; true; i++ ) - бесконечный
         let action = yield new Promise(function (resolve, reject) {
            // click on button in browser and wait load
            setTimeout(function () {
                resolve(i);
            }, 1000);
        });
        if (action === "break") break;
    }
}

let generator = generateSequence();

function go(action) {
    let promise = generator.next(action).value;
    promise.then((res) => {
        // page loaded save links to db
        alert(res);
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve(res + "SAVE");
            }, 2000);
        });
    }).then((res) => {
        // data from link saved in db go next page
        alert(res);
        // check condition break move or not
        go("break");
    });
}

go();