Включить прокси Harmony в nodejs

Можно ли включить прокси EcmaScript 6 Harmony в nodejs? Если да, то каковы плюсы и минусы? И есть ли документация по их использованию? Спасибо !


person Alexandre Kirszenberg    schedule 19.05.2012    source источник


Ответы (5)


Вызов узла с node --harmony-proxies должен помочь.

Плюсы: прокси - очень мощная функция, когда они вам действительно нужны.

Минусы: прокси - это слишком мощная функция, когда они вам не нужны (что должно быть в большинстве случаев). Также реализацию все же следует считать экспериментальной.

Что касается документации, все, что на самом деле есть atm, - это вики Harmony, в частности эта страница, которая отражает текущую реализацию прокси в V8 (и, следовательно, node):

http://wiki.ecmascript.org/doku.php?id=harmony:proxies

person Andreas Rossberg    schedule 19.05.2012
comment
Это действительно было необходимо, однако у меня все еще были проблемы с тем, чтобы заставить его работать. Следующая цепочка и пример также были очень полезны: github.com/joyent/node/issues/4138 < / а> - person odedfos; 13.08.2013
comment
Что такого сильного в такой функции? - person JSON; 10.03.2015

я рекомендую отражение гармонии, что упрощает, например, настроить ловушки получения / установки:

ОБНОВЛЕНИЕ осторожно, ниже CoffeeScript

require 'harmony-reflect'

handler =

  get: ( target, name ) ->
    console.log 'get' name
    return target[ name ]

  set: ( target, name, value ) ->
    console.log 'set' name
    target[ '%is-clean' ] = no if value isnt target[ name ]
    if value is undefined then delete target[ name ]
    else                       target[ name ] = value
    return value

clean = ( x ) ->
  x[ '%is-clean' ] = yes
  return x

p = Proxy {}, handler
p[ 'a' ] = 1
p[ 'b' ] = undefined
console.log p[ 'a' ], p[ 'b' ]
console.log "c" of p, p[ 'c' ]
console.log p
clean p
p[ 'a' ] = 1
console.log p
p[ 'a' ] = 42
console.log p

Выше приведен пример кода для «прозрачного сохранения объекта» в JavaScript. с помощью harmony-reflect становится тривиальным сделать так, чтобы все действия get и set с объектом перехватывались - в этой демонстрации мы устанавливаем атрибут %is-clean, чтобы мы могли проверить, были ли изменены элементы объекта, а также удаляем элементы, которые были установлено значение undefined.

person flow    schedule 19.09.2013
comment
это не JavaScript - person Ege Özcan; 19.12.2013
comment
верный. вопрос был о NodeJS, а не о JavaScript. CoffeeScript компилируется в JavaScript; вы можете скопировать и вставить приведенный выше код на js2coffee.org (вторая вкладка), если вы предпочитаете JS, а не CS. - person flow; 13.01.2014
comment
ну, было бы неплохо иметь здесь код ecmascript-harmony, поскольку вопрос помечен как таковой. - person Ege Özcan; 13.01.2014
comment
Я не понимаю, почему за это проголосовали против ... Я только сейчас работаю над созданием node-cli coffeescript, используя гармонию или ее части ... это именно то, что мне нужно. Спасибо - person Joehannes; 27.10.2015
comment
Coffescript - это НЕ JS @Joehannes - person Snuggs; 06.08.2016

Вы можете использовать pimped-proxy, который представляет собой легкую реализацию прокси, упрощающую декларацию и совместимость с ES5. В отличие от собственного прокси, он может использовать только те свойства, которые известны во время создания.

https://github.com/Boulangerie/pimped-proxy

person user3438710    schedule 10.12.2016

Proxy теперь доступен в версиях Node> = 6.

person Scott Jungwirth    schedule 08.03.2017
comment
У вас есть источник для этого? - person Omri Luzon; 17.08.2017
comment
В то время я это сделал, попробовал журнал изменений на сайте NodeJS, был уверен, что он там был - person Scott Jungwirth; 17.08.2017

Прокси-серверы Harmony не будут работать так хорошо для nodejs, потому что они фактически являются вызовами функций синхронного типа. То есть вы не можете реализовать асинхронный прокси-метод.

Примеры см. В этом репозитории GitHub: https://github.com/mschwartz/SilkJS-Harmony

person mschwartz    schedule 08.11.2012
comment
Я не совсем понимаю, что вы говорите. Конечно, ловушка get может возвращать асинхронную функцию как метод? - person Andreas Rossberg; 09.11.2012
comment
Код гармонии выглядит так: foo = proxy_thing.some_member; some_member - это вызов функции. Я не знаю, как это могло быть асинхронно. - person mschwartz; 21.02.2013
comment
Фанат SilkJS, я не думаю, что вызов функции evert должен быть асинхронным - просто не выполняйте ввод-вывод внутри и все. - person andreypopp; 20.06.2013
comment
Не каждый вызов функции должен быть асинхронным, и вы можете использовать прокси для примитивных типов вещей синхронно с nodejs. Однако, если вы знакомы с ключевым словом tie в Perl, это было бы идеальным вариантом использования для Harmony Proxies, но вам придется синхронизировать получение значения по ключу из redis (например) синхронно. - person mschwartz; 09.08.2013
comment
прокси и (а) синхронность - такие же ортогональные концепции, как, скажем, бутерброды с сыром и государственные праздники. - person flow; 19.09.2013
comment
Чтобы добавить к обсуждению того, почему этот ответ неверен, предстоящее async await позволит вам возвращать значения из получателя, используя синхронный шаблон. А пока есть ноды-волокна и генераторы, которые тоже могут это делать. - person Levi Roberts; 10.03.2016