Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   promise (async await) (https://javascript.ru/forum/node-js-io-js/82531-promise-async-await.html)

fxobject 20.05.2021 13:15

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

fxobject 20.05.2021 13:18

т.е. получается ли так, что в том месте где я вызываю эту функцию и мне необходимо дожидаться результата я должен объявить async (функция откуда делается вызов) и применять await ?

ksa 20.05.2021 14:40

fxobject, можно сделать свою async-функцию и потом в ней все вызывать как await-функции...

ksa 20.05.2021 14:42

fxobject, вот примерчик такого
https://habr.com/ru/post/334772/

fxobject 20.05.2021 16:56

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

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

fxobject 20.05.2021 17:02

Цитата:

Сообщение от ksa (Сообщение 536889)
fxobject, можно сделать свою async-функцию и потом в ней все вызывать как await-функции...

Свою async-функцию сделать неможна. Потому что, как только делается такая функция сразу подразумевается что есть вышестоящий код, который будет ее ожидать.
Но такого кода нет.
Т.е. вот примерно так
А(){
B();
//--- вот тут что будет? подразумевается что с завершена!
}
B(){
c() - и вот тут типа своя функция которая ждет. А что будет с кодом
выше? В функции А?
}

voraa 20.05.2021 17:58

Цитата:

Сообщение от fxobject
Функцию А точно нельзя делать async

Любую функцию можно объявить async
Цитата:

Сообщение от fxobject
Свою async-функцию сделать неможна. Потому что, как только делается такая функция сразу подразумевается что есть вышестоящий код, который будет ее ожидать.
Но такого кода нет.

Как нет кода? А кто же ее вызывает?
Если не надо ждать окончания асинхронной функции, значит не надо вызывать ее с await. Просто вызвать и все, а как она сработает, так и сработает.

voraa 20.05.2021 18:03

Цитата:

Сообщение от 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);

fxobject 20.05.2021 18:40

так. постараюсь еще раз объяснить свою позицию.
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 есть и другие интересные механизмы....
вопрос встал чисто теоретически - ну вот захотелось. можно или нет?

ksa 20.05.2021 18:54

Цитата:

Сообщение от fxobject
На вопрос - как? Ответ скорей всего никак.

Скорее ты не совсем понимаешь всех возможностей Ноды... :(

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


Часовой пояс GMT +3, время: 01:07.