JS - оценка локального выражения на удаленном REPL - прокси и обещание
Я хотел бы определить локальный объект (например,
var robot = RemoteDevice()
), для которого я мог получить доступ к любому свойству или функции (например, или), которые действительно будут выполняться на удаленном REPL, и результат будет отправлен обратно в мою локальную область видимости.
Предположим, у нас уже есть функция, которая может
eval('any command')
удаленно и вернуть результат локально (например, с помощью сериализации JSON). Другими словами, считайте, что функция
robot._eval(command_str)
существует и представляет собой асинхронную функцию, которая может обрабатывать всю связь с удаленным экземпляром для любой команды.
Конкретно я бы хотел
var speed = await robot.speed
работать в фоновом режиме
var speed = await robot._eval('speed')
. по аналогии
robot.move(10)
должен бежать
robot._eval('move(10)')
. И т. Д. Для любых свойств или функций , не определяя их заранее.
В идеале хотелось бы, чтобы он работал на
robot.a.b.c().d
который позвонил бы
robot._eval('a.b.c().d')
.
Я пробовал несколько вещей, см. Ниже, но мне бы хотелось взглянуть свежим взглядом на проблему. Я также знаю, что это может работать только с типами по умолчанию, которые можно сериализовать.
Как бы вы начали делать что-то подобное? Знаете ли вы какую-либо библиотеку или пример, который я мог бы использовать или вдохновить?
Ответы на часто задаваемые вопросы ниже:
Попытался ли ты? Да, см. . Моя основная проблема при попытке заключалась в том, чтобы различать свойства, которые должны возвращать значение, и функции, которые должны возвращать функцию, которая вызывается позже.
robot.speed
должен возвращать значение скорости на удаленном ответе.robot.move
- это функция на удаленном реплике, поэтому она должна возвращать локально функцию, которая будет вызыватьrobot._eval(move(args))
когда звонили. Для этого требуется вложение Proxy и Promise, см. [1] , [2], и промежуточный удаленный вызов к_eval(`typeof move`)
.Зачем вы вообще хотите это делать? Мой вариант использования - устранить необходимость в явном протоколе связи между веб-браузером и встроенным устройством (роботом) , на котором запущен https://www.espruino.com/, который является встроенным интерпретатором JS REPL. Я хочу получать информацию с устройства в моем браузере, как если бы это была локальная переменная.
Почему бы просто не позвонить
robot._write('yourcommand')
? Это чистое любопытство, я считаю, что он удобен и хорош для быстрого прототипирования. Меня искренне интересовало, можно ли и как это сделать. Я пробовал несколько подходов (см. Http://forum.espruino.com/conversations/362281/Http://forum.espruino.com/conversations/362281/ ) и мог заставить его работать на первом уровне (например,var sum = await robot.add(2, 45)
,speed = await robot.speed
). Но не знаю, как добратьсяrobot.a.b.c()
.d например.Что бы вы попробовали дальше? Я бы попытался дозвониться до
robot
для вывода строки вызванной команды. Напримерvar command = await robot.a.b.c(args).d
должен вернуться"a.b.c(args).d"
, а затем надстроить его.