Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.05.2021, 13:15
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

promise (async await)
Уважаемые господа!
Необходимо осуществить чтение из БД и при этом нужно дождаться результата.
есть класс MSSQL и у него функция
async readQuery( option ){
.......
здесь
формируем и выполняем запрос
ждем его выполнения
return result; //--- результат запроса (массив объектов)
}
все замечательно. при выполнении функции все происходит как нужно
но дело в том, что async сам по себе промис, и выполняется отдельно.
т.е. в том месте где нужно обратится к функции:
let query = { query:'select * from dbo.spin' }
let result = global.mssql.readQuery(query); //--- а вот тут не ждем
//--- а сюда ходить без результата нельзя
ну и соответственно result получается не тот, который должна вернуть функция, а объект промиса.
Собственно вопрос - как дождаться выполнения этой функции?
Спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 20.05.2021, 13:18
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

т.е. получается ли так, что в том месте где я вызываю эту функцию и мне необходимо дожидаться результата я должен объявить async (функция откуда делается вызов) и применять await ?
Ответить с цитированием
  #3 (permalink)  
Старый 20.05.2021, 14:40
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

fxobject, можно сделать свою async-функцию и потом в ней все вызывать как await-функции...
Ответить с цитированием
  #4 (permalink)  
Старый 20.05.2021, 14:42
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

fxobject, вот примерчик такого
https://habr.com/ru/post/334772/
Ответить с цитированием
  #5 (permalink)  
Старый 20.05.2021, 16:56
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

Увы вопрос не понят. Сейчас он уже даже не в технической а в концептуальной форме.
функция А(){
ФункцияКоторуюНужноПодожд ать(); //" асинхронная "
//--- здесь функция которую нужно подождать точно завершена
следующий код
}

Функцию А точно нельзя делать async
Вот вопрос ставится именно так. Все остальные комбинации (технический) как реализовать, async и всякое такое не вариант.
На вопрос - как? Ответ скорей всего никак.
можно организовать некую переменную для контроля завершения. например так:
let finished = false;
ФункцияКоторуюНужноПодожд ать();
while( finished ){}
Но так тоже не пойдет - JS это не многопоточная среда. Чтобы выполнился "асинхронный" (на самом деле он ни какой не асинхронный) код необходимо закончить цикл и уйти в ядро JS. Потому как пока крутится цикл - все так называемые асинхронные задачи остановлены.
Если есть вариант в цикле отдать управление очереди JS и потом получить обратно в то же самое место, то задачу решить в такой постановке удастся.
Например
let finished = false;
ФункцияКоторуюНужноПодожд ать();
while( finished ){
ОтдатьУправлениеОчередиJS() ;
}
Ответить с цитированием
  #6 (permalink)  
Старый 20.05.2021, 17:02
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

Сообщение от ksa Посмотреть сообщение
fxobject, можно сделать свою async-функцию и потом в ней все вызывать как await-функции...
Свою async-функцию сделать неможна. Потому что, как только делается такая функция сразу подразумевается что есть вышестоящий код, который будет ее ожидать.
Но такого кода нет.
Т.е. вот примерно так
А(){
B();
//--- вот тут что будет? подразумевается что с завершена!
}
B(){
c() - и вот тут типа своя функция которая ждет. А что будет с кодом
выше? В функции А?
}
Ответить с цитированием
  #7 (permalink)  
Старый 20.05.2021, 17:58
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,709

Сообщение от fxobject
Функцию А точно нельзя делать async
Любую функцию можно объявить async
Сообщение от fxobject
Свою async-функцию сделать неможна. Потому что, как только делается такая функция сразу подразумевается что есть вышестоящий код, который будет ее ожидать.
Но такого кода нет.
Как нет кода? А кто же ее вызывает?
Если не надо ждать окончания асинхронной функции, значит не надо вызывать ее с await. Просто вызвать и все, а как она сработает, так и сработает.
Ответить с цитированием
  #8 (permalink)  
Старый 20.05.2021, 18:03
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,709

Сообщение от fxobject
let query = { query:'select * from dbo.spin' }
let result = global.mssql.readQuery(query); //--- а вот тут не ждем
//--- а сюда ходить без результата нельзя
ну и соответственно result получается не тот, который должна вернуть функция, а объект промиса.
Собственно вопрос - как дождаться выполнения этой функции?
Выже сами писали
Сообщение от fxobject
есть класс MSSQL и у него функция
async readQuery( option ){
Значит вызывать ее надо
let result = await global.mssql.readQuery(query);
Ответить с цитированием
  #9 (permalink)  
Старый 20.05.2021, 18:40
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 133

так. постараюсь еще раз объяснить свою позицию.
function А(){
//--- где то там вызовется асинхинхронная функция
B();
//Точка 1 вот тут нужны результаты асинхронной функции
}
B(){
что то делаем
//--- где то там вызовется асинхинхронная функция
С();
// Точка 2 а тут тем более нужны результаты асинхронной функции
}

C(){
//-- еще раз что то делаем
D() АСИНХРОННО!!!
// Точка 3
// надо дождаться D ниже код зависит от результата
// не только ниже но и по стеку вызовов функции все остальные тоже
// зависят и любой ваш async запланируем выполнение D (ского бы вы
не ставили await ов), но сразу же D завершится с возвратом промиса
и пойдет по коду дальше..... выйдет из всех процедур (а тама ждут результата) и только вывалившись в ядро JS (попав в очередь задач) начнет выполнять D. завершит D передаст результаты then и что потом?
А мне они нужны в точке Точка 1,2,3
}

Господа, я понимаю что такое await и все что с этим связано - вникните в постановку задачи. Если идти по вашему предложению, тогда всю логику (Точка 1,2,3) необходимо запихивать в колбэк (это собственно и есть ваш промис) для асинхронной функции.
Это понятно, даже правильно. В таких случаях кроме promise есть и другие интересные механизмы....
вопрос встал чисто теоретически - ну вот захотелось. можно или нет?
Ответить с цитированием
  #10 (permalink)  
Старый 20.05.2021, 18:54
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

Сообщение от fxobject
На вопрос - как? Ответ скорей всего никак.
Скорее ты не совсем понимаешь всех возможностей Ноды...

Есть еще события. Их можно назначить при вызове асинхронной функции, а инициировать событие уже в колбеке, когда данные получены и их можно передать в обработчик события...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами в mongodb, api, frontend с паттерном async & await YTigiev Node.JS 0 21.11.2019 20:17
async await + es6???? Роман Андреевич Node.JS 1 20.12.2018 13:25
Выполнение массива промисов последовательно arealhz Node.JS 30 07.07.2018 12:45
Представляем вам ORMjs ORMjs Оффтопик 55 17.01.2017 02:46
распарсить строку json sotik AJAX и COMET 14 24.11.2014 16:06