Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.05.2024, 14:00
Интересующийся
Отправить личное сообщение для Steh Посмотреть профиль Найти все сообщения от Steh
 
Регистрация: 02.02.2024
Сообщений: 10

Асинхронная функция в replace возвращает описание промиса
Асинхронная функция в replace выводит в консоль нормальные резы, а возвращает [object Promise]

Такое впечатление, что не дожидается результата. Почему так? Без функции срабатывает нормально, например, когда меняешь на результат асинхронного чтения. Получается функция в функции, из-за этого какие-то баги. Такое бывает в алерте с объектами, пробовал приводить к строке, не помогает.
Ответить с цитированием
  #2 (permalink)  
Старый 29.05.2024, 14:39
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Ничего не понял, но очень интересно. ©
Без кода сложно сказать что вы делаете неправильно.

[object Promise] - результат приведения промиса к строке.
Ответить с цитированием
  #3 (permalink)  
Старый 29.05.2024, 14:50
Интересующийся
Отправить личное сообщение для Steh Посмотреть профиль Найти все сообщения от Steh
 
Регистрация: 02.02.2024
Сообщений: 10

replace(/.../, async () => await fs.promises.readFile...
когда console.log , норм резы, а с return заменяет на канитель

Последний раз редактировалось Steh, 29.05.2024 в 14:53.
Ответить с цитированием
  #4 (permalink)  
Старый 29.05.2024, 14:52
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Steh, где вы взяли функцию replace?
Вы уверены, что она может принимать вторым аргументом Promise?

Может стоит попробовать так?
readFile.then(content => replace(/../, content)).then(console.log);
Ответить с цитированием
  #5 (permalink)  
Старый 29.05.2024, 14:55
Интересующийся
Отправить личное сообщение для Steh Посмотреть профиль Найти все сообщения от Steh
 
Регистрация: 02.02.2024
Сообщений: 10

попробую с обычным чтением
Ответить с цитированием
  #6 (permalink)  
Старый 29.05.2024, 15:26
Интересующийся
Отправить личное сообщение для Steh Посмотреть профиль Найти все сообщения от Steh
 
Регистрация: 02.02.2024
Сообщений: 10

я хочу попробовать в одну строчку, разделю сейчас

cont=(await readFile('layout.html','utf8'))

.replace('{% get title %}', await readFile(rqu+'title.html','utf8'))
.replace('{% get content %}',await readFile(rqu+'content.html','utf8'))
.replace('{% key %}',await readFile(rqu+'key.html','utf8'))
.replace('{% desc %}',await readFile(rqu+'desc.html','utf8'))

.replace(/{% get elem (\w+?) %}/g, async (a, b) =>await readFile(rqu+'elem/' + b + '.html', 'utf8'));


подводит последний фрагмент
Ответить с цитированием
  #7 (permalink)  
Старый 29.05.2024, 16:07
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Не, так просто тут не сделать.
Последняя строчка не пройдет.
Попробуйте вместо нее такой код
const matchs = cont.matchAll(/{% get elem (\w+?) %}/g);
for (const m of matchs) {
	cont = cont.replace(m[1], await readFile(rqu+'elem/' + m[2] + '.html', 'utf8')
}
Ответить с цитированием
  #8 (permalink)  
Старый 29.05.2024, 16:18
Интересующийся
Отправить личное сообщение для Steh Посмотреть профиль Найти все сообщения от Steh
 
Регистрация: 02.02.2024
Сообщений: 10

спасибо за совет, через match могу сделать, интересовала причина. Ну, видимо, так устроено
Ответить с цитированием
  #9 (permalink)  
Старый 29.05.2024, 16:43
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от Steh
Ну, видимо, так устроено
Конечно. В данном случае задается cfllback функция, которая будет, когда надо, вызываться из функции replace. И вызываться она будет без await. И возвращать не строку, а промис.
Ответить с цитированием
  #10 (permalink)  
Старый 29.05.2024, 21:37
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

Если ты в ноде, то можешь использовать readFileSync, хотя это и не рекомендуется.

Реплейсить в несколько проходов в любом случае - не стоит. По простому я бы сделал arr = base.split(/\{% (.*?) %\}/g) и проход через for(let i=1; i < arr.length; i+=2) { ... }.

Ну и в принципе если ты свой шаблонизатор пишешь который в теории будет усложняться, то лучше сразу без регулярок обойтись - "по взрослому" делать ast и\или конечный автомат.
__________________
29375, 35
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Асинхронная функция Artur_Hopf Node.JS 11 24.04.2018 13:37
Функция возвращает то заглавную, то не заглавную букву prog77 jQuery 8 27.07.2017 12:17
Выпадающее меню на JS (подкатегории) Trueplayer Events/DOM/Window 5 18.09.2014 22:29
Древовидное меню и селекторы youstm jQuery 6 15.09.2014 12:42
функция проверки форм не возвращает false voodoo Общие вопросы Javascript 6 27.06.2011 13:14