272 / 176 / 30
Регистрация: 16.03.2017
Сообщений: 1,626
1

Результат колбэка вернуть как результат функции

11.03.2020, 10:57. Показов 1067. Ответов 5
Метки нет (Все метки)

Добрый день, подскажите плииииз, такое в принципе возможно? (потери в продуктивности не важны)

Есть "линейная" функция (без колбэка) встроенная в модуль.
(пример сильно упрощенный - на самом деле она вообще в JS встроена "на уровне браузера")

Javascript
1
2
3
function get_val_1(){
   return new Date().getTime()
}
используется примерно так:

Javascript
1
2
var dd=get_val_1()+100
if(dd<dd_new){....
(никаких колбэков, колбэкхелов и тд. - "просто и понятно")

Теперь на другом модуле хочу "ПОДДЕЛАТЬ" эту функцию, взяв результат с сервера через ajax.
"Применение" менять нельзя! только функцию...

Теперь надо сделать что-то вроде:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function get_date(){
   var res
   setTimeout(function(){
        // имитируем долгий ответ из ajax
           res=1234
       console.log('res +++ ', res)
   }, 1000)
   var ii=0
   while(res==null){
     console.log('res='+res)
 
       ii++
       if(ii>10000)break
   }
   return res
}
... конечно пример зависает, выводит 10К null, думает несколько секунд, останавливается на null, а только потом "дает возможность отработать таймеру".

"Зависание"/"перегрев" браузера для меня НЕ КРИТИЧНО!!! Главное - чтобы сработало...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2020, 10:57
Ответы с готовыми решениями:

Как вернуть результат функции в литерал объекта
Всем здасьте, Пытаюсь написать скрипт рулетки. Ссылка на файлы Затык в следующем - при нажатии на...

Возврат responseText из XMLHttpRequest aka AJAX как результат работы функции
Вот как бы обычный Ajax запрос, на чистом JS. function ajax() { var xhr = new...

Получить результат функции
Доброго времени суток. Есть функция проверки одного из полей формы function checkUsername() {...

Возврат результат из функции
На вход процедуры подаю ширину и долготу, но не могу понять как вернуть результат этот функции в...

5
272 / 176 / 30
Регистрация: 16.03.2017
Сообщений: 1,626
12.03.2020, 17:25  [ТС] 2
up!

Есть хоть какие-нибудь идеи??? Ну ОЧЕНЬ нужно...

...попробовал сделать отдельную страницу-"исполнителя"(открытую в соседней закладке) и отправлять ей задачи через
Javascript
1
localStorage.setItem("ask"), JSON.stringify({cmd: "запрос"}));
а потом через getItem("answer") в бесконечном цикле ждать ответа...

"исполнитель" ловит заказ в setInterval и имитирует выполнение. результат возвращает в тот-же сторедж (под другим именем/ключем)

Оказалось что Хром пока не закончит цикл не "отправит" изменения в сторэдж для других окон. (исполнитель не получает заказ)

А Опера наоборот - держит старый кеш сторэджа, взятый перед циклом. И свежие данные получит лишь после окончания обработчика eventloop. (исполнитель успешно получил заказ, засунул в сторэдж ответ, но "заказчик" получит результат только после выхода из цикла)


Еще раз задача:

Есть (самописный/переделанный) браузер, в который ВСТРОЕНЫ (специализированные) функции возвращающие строковые и числовые значения. Без колбэков! прямо в result.

Мне нужен инструмент для отладки/разработки страниц под тот браузер, где значения для "поддельных" функций будут браться с сервера-ретранслятора через ajax.

Есть возможность подобное проделать не оборачивая эти-функции в колбэк-обертки ради "совместимости"?

Может можно в хром или оперу такие-же "встроенные" ГЛОБАЛЬНЫЕ функции встроить? Например на уровне С++ или плагинов?

Добавлено через 1 час 22 минуты
ВОПРОС ЗАКРЫТ!

Помогли куки! Та-же методика - окошку-"исполнителю" через куки отправил задачу и в бесконечном цикле дождался возврата ответа.

Единственный явный недостаток - это 10-20% процессорного времени "съедаемого" во время холостого бесконечного цикла... было бы круто использовать что-то вроде "остановки потока на время" как в других языках... вроде sleep(300)
1
129 / 112 / 39
Регистрация: 27.09.2012
Сообщений: 305
12.03.2020, 19:20 3
andyj, есть же промисы и async/await. Да и чем колбэки плохи?
1
272 / 176 / 30
Регистрация: 16.03.2017
Сообщений: 1,626
12.03.2020, 19:38  [ТС] 4
Цитата Сообщение от Antiplayer Посмотреть сообщение
есть же промисы и async/await. Да и чем колбэки плохи?
ничем не плохи, но не подходят!

есть простой скрипт вида

Javascript
1
2
3
4
5
6
7
function test(){
  var dd=device1.get_val_1(1)+108
  if(dd<5){
    if(dd>device1.get_val_1(32)) return 15
  }
  return 22
}
device1.get_val_1 - это функция ВКОМПИЛИРОВАННАЯ в браузер на устройстве. Она берет значения прямо с датчиков устройства.
Как видите код получается компактным и понятным БЕЗ кучи колбэков. (на релизе нет смысла его усложнять)

Но разрабатывать/отлаживать/тестировать на устройстве - не удобно. (заливать тяжело/медленно, монитор не удобный)
Решил создать эмулятор прямо в Хроме.
Но данные хочу брать все-таки с тестового устройства к которым можно обратиться через веб-сервер-ретранслятор через ajax. Пусть с задержкой, но цифры будут актуальными.

Вывод - надо:
1) поймать факт что страница открылась не на устройстве - хватает if(device1 == null) и подгрузить модуль создающий недостающие функции.
2) сделать свою ЭМУЛЯЦИЮ функции device1.get_val_1, которая будет в ТОМ-же коде возвращать цифры с УДАЛЕННОГО устройства. Которое оно будет получать через ajax.

...но... код test() менять нельзя! ни на колбэки ни на async/await.
...почти 2 дня думал как обмануть систему! )) официально в event-loop такое сделать нельзя! никак! ))
0
129 / 112 / 39
Регистрация: 27.09.2012
Сообщений: 305
13.03.2020, 09:56 5
Цитата Сообщение от andyj Посмотреть сообщение
...но... код test() менять нельзя! ни на колбэки ни на async/await.
Так и не меняйте. Его можно обернуть в промисы или реализовать асинхронную проверку возвращаемого значения с помощью таймаута. Вариантов масса, но к сожалению задача не очень понятная.
0
272 / 176 / 30
Регистрация: 16.03.2017
Сообщений: 1,626
14.03.2020, 05:37  [ТС] 6
Цитата Сообщение от Antiplayer Посмотреть сообщение
Вариантов масса, но к сожалению задача не очень понятная
Есть языки/среды (с++, делфи, лазарус, java, АНДРОИД), которые позволяют в своих формах использовать "компонент-веб-браузер". Например чтобы написать свой собственный специализированный браузер

Не по теме:

...я когда-то на лазарус написал браузер "с тоненькими бортиками, отключаемой шапкой и on-top = очень удобно для тестирования/отладки JS. Добавил кнопку send (ajax или сокеты) и на экране лишь одна "плавающая" маленькая кнопка с целым бразуером вокруг пока ты "реакцию сервера" доделываешь/отлаживаешь.


В эти "самописные" браузеры можно встроить/добавить прямо в ядро JS свои объекты/функции! Прямо на уровне ядра! Как объект windows в браузерах. Например get_disk_size("с:"):int - без всяких колбэков. Вот "под такой браузер" и пишется сайт.
Но дописывать/менять/отлаживать его проще все-таки на большом мониторе и на домашнем компьютере, а не на удаленном устройстве с маленьким монитором (или даже без него).

Цитата Сообщение от Antiplayer Посмотреть сообщение
можно обернуть в промисы или реализовать асинхронную проверку возвращаемого значения с помощью таймаута
Еще раз...
есть index.html+index.js, которые написаны без использования колбэков под специальны браузер. Вполне успешно работающий. Код простой и понятный.
Надо: подгрузив в index.html модуль emule.js "перекрыть" линейные функции которые брали значения из браузера и подсунуть ему значения которые можно взять только с сервера через ajax (только с колбэком).

index.js менять НЕЛЬЗЯ! вообще! И в index.htm можно лишь добавить проверку "если ты отладчик/разработчик - догрузи еще модули эмулятора)

...ладно... пока задачу решил! вопрос закрываю! правда работает только в Опере (хром еще не проверял, а в очень старом хроме(хромиум) не сработало), но мне пока хватит - это уже на порядок упростило и ускорило разработку.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2020, 05:37
Помогаю со студенческими работами здесь

Результат функции не записывается в переменную
Добрый день. Обьясните, пожалуйста. Есть у меня функцкия var f1 = function(JSON_array, arrPushTo),...

Не всегда правильный результат функции
Почему-то все числа кроме 4 и 2 определяет правильно Два целых числа a и b называются взаимно...

Вывести результат переменной за пределы функции
Нужно вывести результат переменных за пределы функции для использования их в основном коде. У меня...

Как передать результат в скрипт?
&lt;div id=&quot;content&quot;&gt;&lt;/div&gt; &lt;script...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru