LINUX.ORG.RU

Вызов асинхронной функции в конструкторе класса

 


0

1

Привет. Вообщем, делаю я тут приложение, читающее данные с веба. Думаю, пусть будет класс Page, там должен быть метод load (делающий то же самое что и конструктор класса), загружающий код из веба. Типа так:

var p = new Page("http://ya.ru") // вернёт объект класса Page, содержащий код страницы
p.load("http://mail.ru/") // сотрёт предыдущие данные, вернёт код страницы мейл-ру

Я знаю, что такой код будет выполняться долго, он будет блокировать приложение, но я так понимаю, если этот код обернуть в async function, то будет норм.

Я предполагаю, что async означает, что интерпретатор продолжит выполнение программы не дожидаясь окончания выполнения функции, хотя нигде в сети я не нашёл явного указания на это.

Проблема в чём: async функция возвращает promise, тогда как конструктор возвращает объект типа Page. Это значит, что возврат promise приведёт к ошибке, или я что-то не понимаю.

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

считывание и парсинг данных одной функцией без коллбеков

Ты изобрёл синхронный код ))

vvn_black ★★★★★ ()
Ответ на: комментарий от russian-turist-2019

Так ведь, если код асинхронный, то удобнее результат получать колбеками, если ждать выполнение каждой корутины (мешать синхронный и асинхронный код), то код превращается просто в синхронный.

vvn_black ★★★★★ ()
Ответ на: комментарий от vvn_black

http-запрос - долгая операция. Парсинг должен идти после запроса, а например другой такой запрос параллельно ему.

В результате хотелось бы видеть что-то такое:

async f1 = () => parse(loadfromhttp(url1))

async f2 = () => parse(loadfromftp(url2))

f1();f2()

Параллельно должны начать выполняться loadfromhttp и loadfromftp. Разве такое нельзя сделать?

russian-turist-2019 ()

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

WitcherGeralt ★★ ()

в питоне тоже конструктор асинхронным быть не может. в яваскрипте асинхронные функции возвращают промис. у него есть методы then/catch. тебе ничто не мешает вызвать асинхронную функцию внутри. можно сделать статический метод, который будет асинхронным и вернет, созданный объект типа const con = await DBAdapter.connect(params)

tz4678 ★★ ()
Ответ на: комментарий от tz4678

А вот это хороший ответ. Пожалуй, так и сделаю. Спасибо за помощь, вопрос решён

russian-turist-2019 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.