|
promise (async await)
Уважаемые господа!
Необходимо осуществить чтение из БД и при этом нужно дождаться результата. есть класс MSSQL и у него функция async readQuery( option ){ ....... здесь формируем и выполняем запрос ждем его выполнения return result; //--- результат запроса (массив объектов) } все замечательно. при выполнении функции все происходит как нужно но дело в том, что async сам по себе промис, и выполняется отдельно. т.е. в том месте где нужно обратится к функции: let query = { query:'select * from dbo.spin' } let result = global.mssql.readQuery(query); //--- а вот тут не ждем //--- а сюда ходить без результата нельзя ну и соответственно result получается не тот, который должна вернуть функция, а объект промиса. Собственно вопрос - как дождаться выполнения этой функции? Спасибо |
т.е. получается ли так, что в том месте где я вызываю эту функцию и мне необходимо дожидаться результата я должен объявить async (функция откуда делается вызов) и применять await ?
|
fxobject, можно сделать свою async-функцию и потом в ней все вызывать как await-функции...
|
fxobject, вот примерчик такого
https://habr.com/ru/post/334772/ |
Увы вопрос не понят. Сейчас он уже даже не в технической а в концептуальной форме.
функция А(){ ФункцияКоторуюНужноПодожд ать(); //" асинхронная " //--- здесь функция которую нужно подождать точно завершена следующий код } Функцию А точно нельзя делать async Вот вопрос ставится именно так. Все остальные комбинации (технический) как реализовать, async и всякое такое не вариант. На вопрос - как? Ответ скорей всего никак. можно организовать некую переменную для контроля завершения. например так: let finished = false; ФункцияКоторуюНужноПодожд ать(); while( finished ){} Но так тоже не пойдет - JS это не многопоточная среда. Чтобы выполнился "асинхронный" (на самом деле он ни какой не асинхронный) код необходимо закончить цикл и уйти в ядро JS. Потому как пока крутится цикл - все так называемые асинхронные задачи остановлены. Если есть вариант в цикле отдать управление очереди JS и потом получить обратно в то же самое место, то задачу решить в такой постановке удастся. Например let finished = false; ФункцияКоторуюНужноПодожд ать(); while( finished ){ ОтдатьУправлениеОчередиJS() ; } |
Цитата:
Но такого кода нет. Т.е. вот примерно так А(){ B(); //--- вот тут что будет? подразумевается что с завершена! } B(){ c() - и вот тут типа своя функция которая ждет. А что будет с кодом выше? В функции А? } |
Цитата:
Цитата:
Если не надо ждать окончания асинхронной функции, значит не надо вызывать ее с await. Просто вызвать и все, а как она сработает, так и сработает. |
Цитата:
Цитата:
let result = await global.mssql.readQuery(query); |
так. постараюсь еще раз объяснить свою позицию.
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 есть и другие интересные механизмы.... вопрос встал чисто теоретически - ну вот захотелось. можно или нет? |
Цитата:
Есть еще события. Их можно назначить при вызове асинхронной функции, а инициировать событие уже в колбеке, когда данные получены и их можно передать в обработчик события... |
Часовой пояс GMT +3, время: 01:07. |
|