Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #201 (permalink)  
Старый 01.03.2015, 22:34
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

nerv, для написания итераторов удобно использовать генераторы.

function *makeIterator(array){
    var nextIndex = 0;

    while (nextIndex < array.length) {
        yield array[nextIndex++];
    }
}

var iterator = makeIterator([1,2,3]);

for (var key of iterator) {
    alert(key);
}


А ещё можно так:

for (var key of (el for (el of [1,2,3]))) {
    alert(key);
}
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 01.03.2015 в 22:44.
Ответить с цитированием
  #202 (permalink)  
Старый 01.03.2015, 22:51
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

kobezzza, ага, спасибо, я знаю. Только без regeneratorRuntime в ES5 работать не будет.

Кстати, эта поделка от фейсбука https://github.com/facebook/regenerator
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #203 (permalink)  
Старый 01.03.2015, 22:56
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от nerv_ Посмотреть сообщение
kobezzza, ага, спасибо, я знаю. Только без regeneratorRuntime в ES5 работать не будет.

Кстати, эта поделка от фейсбука https://github.com/facebook/regenerator
Угу, она юзается в Babel.
__________________
kobezzza
code monkey
Ответить с цитированием
  #204 (permalink)  
Старый 07.03.2015, 21:38
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Наткнулся тут на одну фичу, здесь, вроде, еще не было:

let room = new Room();
let character = new Character({room});
assert.equal(character.room, room);

room.destroy();
assert.isNull(character.room);
assert.isNull(room); //!!!

И даже кодить ничего не надо:
const revoke = Symbol();

class Model {
    constructor() {
        let {
            proxy,
            revoke: revokeHandler
        } = Proxy.revocable(this, {});
        
        this[revoke] = revokeHandler;
  
        return proxy;
    }
    
    destroy() {
       this[revoke]();
    }
}

class Character extends Model {
    constructor(room) {
        super();
        Object.assign(this, {
            room
        });
    }
}

class Room extends Model {}

https://people.mozilla.org/~jorendor...roxy.revocable
Ответить с цитированием
  #205 (permalink)  
Старый 09.03.2015, 21:02
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Изобретаем Deferred по новой
class Deferred {

    constructor(generator) {
        this.promise = new Promise((resolve, reject) => {
            Object.assign(this, {resolve, reject});
        });
        generator.next();
        let next = value => {
            let result = generator.next(value);
            if (!result.done) {
                value = result.value;
                if (value && value.next) {
                    new Deferred(value).done(next).fail(this.reject);
                } else {
                    next(value);
                }
            }
        };
        next(this);
    }

    done(onFulfilled) {
        this.promise.then(onFulfilled);
        return this;
    }
    
    fail(onRejected) {
        this.promise.catch(onRejected);
        return this;
    }

}
function * getFoo() {
    let deferred = yield;
    setTimeout(function() {
        deferred.resolve('foo');
    }, 100);
}

function * getBar() {
    let deferred = yield;
    let foo = yield getFoo();
    setTimeout(function() {
        deferred.resolve(foo + 'bar');
    }, 100);
}

new Deferred(getBar()).done(function(value) {
    console.log(value);
});

// в консоль выведется "foobar"

Последний раз редактировалось Octane, 09.03.2015 в 21:06.
Ответить с цитированием
  #206 (permalink)  
Старый 12.03.2015, 18:55
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Octane, поясняй пож. я, например, нифига не понял

Tagged template strings. Вызываем функции без скобок?

alert`1`

тот же код, пропущенный через babel:
"use strict";

var _taggedTemplateLiteral = function (strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); };

alert(_taggedTemplateLiteral(["1"], ["1"]));
Ответить с цитированием
  #207 (permalink)  
Старый 12.03.2015, 19:53
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
Octane, поясняй пож. я, например, нифига не понял

Tagged template strings. Вызываем функции без скобок?
Ну, это решение следующей проблемы:

var myStr = `
  Hello ${name}!
  I'm glad to see you.
`;


Если все оставить как есть, то в нашей строке будут переводы строк и начальные пробелы, а зачастую нам это совсем не нужно. В некоторых языках существуют разные литералы строк, которые могут по разному обрабатывать такие кейзы, но в JS решили сделать самый универсальный способ: позволить пользователю самому определять "тег" для строки, где обрабаывать нужную логику (экранирование, переводы строк и т.д.)

var myStr = n2br`
  Hello ${name}!
  I'm glad to see you.
`;


Скобки тут бы очень мешались, поэтому их нет, всё просто

К сожалению тег может быть только один
__________________
kobezzza
code monkey
Ответить с цитированием
  #208 (permalink)  
Старый 12.03.2015, 19:57
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

К моему удивлению, с babel прокатил такой синтаксис:
class X {
	'method'() {
		
	}
}

Баг или фича?
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #209 (permalink)  
Старый 12.03.2015, 19:59
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от FINoM Посмотреть сообщение
К моему удивлению, с babel прокатил такой синтаксис:
class X {
	'method'() {
		
	}
}

Баг или фича?
Это нормальный синтаксис ES6:

class X {
	method() {

	}

	'@method'() {

	}

	[1 + 2]() {

	}
}
__________________
kobezzza
code monkey
Ответить с цитированием
  #210 (permalink)  
Старый 12.03.2015, 20:51
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

melky,
Цитата:
Tagged template strings. Вызываем функции без скобок?
kobezzza,
Цитата:
Скобки тут бы очень мешались, поэтому их нет, всё просто
Я однажды чуть не психанул и не переписал все вызовы методов в таком стиле
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать HTML фичи? 2chan Events/DOM/Window 6 26.09.2014 18:50