20.05.2021, 13:15
|
|
Кандидат Javascript-наук
|
|
Регистрация: 01.03.2021
Сообщений: 138
|
|
promise (async await)
Уважаемые господа!
Необходимо осуществить чтение из БД и при этом нужно дождаться результата.
есть класс MSSQL и у него функция
async readQuery( option ){
.......
здесь
формируем и выполняем запрос
ждем его выполнения
return result; //--- результат запроса (массив объектов)
}
все замечательно. при выполнении функции все происходит как нужно
но дело в том, что async сам по себе промис, и выполняется отдельно.
т.е. в том месте где нужно обратится к функции:
let query = { query:'select * from dbo.spin' }
let result = global.mssql.readQuery(query); //--- а вот тут не ждем
//--- а сюда ходить без результата нельзя
ну и соответственно result получается не тот, который должна вернуть функция, а объект промиса.
Собственно вопрос - как дождаться выполнения этой функции?
Спасибо
|
|
20.05.2021, 13:18
|
|
Кандидат Javascript-наук
|
|
Регистрация: 01.03.2021
Сообщений: 138
|
|
т.е. получается ли так, что в том месте где я вызываю эту функцию и мне необходимо дожидаться результата я должен объявить async (функция откуда делается вызов) и применять await ?
|
|
20.05.2021, 14:40
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
fxobject, можно сделать свою async-функцию и потом в ней все вызывать как await-функции...
|
|
20.05.2021, 14:42
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
|
|
20.05.2021, 16:56
|
|
Кандидат Javascript-наук
|
|
Регистрация: 01.03.2021
Сообщений: 138
|
|
Увы вопрос не понят. Сейчас он уже даже не в технической а в концептуальной форме.
функция А(){
ФункцияКоторуюНужноПодожд ать(); //" асинхронная "
//--- здесь функция которую нужно подождать точно завершена
следующий код
}
Функцию А точно нельзя делать async
Вот вопрос ставится именно так. Все остальные комбинации (технический) как реализовать, async и всякое такое не вариант.
На вопрос - как? Ответ скорей всего никак.
можно организовать некую переменную для контроля завершения. например так:
let finished = false;
ФункцияКоторуюНужноПодожд ать();
while( finished ){}
Но так тоже не пойдет - JS это не многопоточная среда. Чтобы выполнился "асинхронный" (на самом деле он ни какой не асинхронный) код необходимо закончить цикл и уйти в ядро JS. Потому как пока крутится цикл - все так называемые асинхронные задачи остановлены.
Если есть вариант в цикле отдать управление очереди JS и потом получить обратно в то же самое место, то задачу решить в такой постановке удастся.
Например
let finished = false;
ФункцияКоторуюНужноПодожд ать();
while( finished ){
ОтдатьУправлениеОчередиJS() ;
}
|
|
20.05.2021, 17:02
|
|
Кандидат Javascript-наук
|
|
Регистрация: 01.03.2021
Сообщений: 138
|
|
Сообщение от ksa
|
fxobject, можно сделать свою async-функцию и потом в ней все вызывать как await-функции...
|
Свою async-функцию сделать неможна. Потому что, как только делается такая функция сразу подразумевается что есть вышестоящий код, который будет ее ожидать.
Но такого кода нет.
Т.е. вот примерно так
А(){
B();
//--- вот тут что будет? подразумевается что с завершена!
}
B(){
c() - и вот тут типа своя функция которая ждет. А что будет с кодом
выше? В функции А?
}
|
|
20.05.2021, 17:58
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Сообщение от fxobject
|
Функцию А точно нельзя делать async
|
Любую функцию можно объявить async
Сообщение от fxobject
|
Свою async-функцию сделать неможна. Потому что, как только делается такая функция сразу подразумевается что есть вышестоящий код, который будет ее ожидать.
Но такого кода нет.
|
Как нет кода? А кто же ее вызывает?
Если не надо ждать окончания асинхронной функции, значит не надо вызывать ее с await. Просто вызвать и все, а как она сработает, так и сработает.
|
|
20.05.2021, 18:03
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Сообщение от 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);
|
|
20.05.2021, 18:40
|
|
Кандидат Javascript-наук
|
|
Регистрация: 01.03.2021
Сообщений: 138
|
|
так. постараюсь еще раз объяснить свою позицию.
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 есть и другие интересные механизмы....
вопрос встал чисто теоретически - ну вот захотелось. можно или нет?
|
|
20.05.2021, 18:54
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от fxobject
|
На вопрос - как? Ответ скорей всего никак.
|
Скорее ты не совсем понимаешь всех возможностей Ноды...
Есть еще события. Их можно назначить при вызове асинхронной функции, а инициировать событие уже в колбеке, когда данные получены и их можно передать в обработчик события...
|
|
|
|