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", а затем надстроить его.

0 ответов

Другие вопросы по тегам