29.05.2024, 14:00
|
Интересующийся
|
|
Регистрация: 02.02.2024
Сообщений: 10
|
|
Асинхронная функция в replace возвращает описание промиса
Асинхронная функция в replace выводит в консоль нормальные резы, а возвращает [object Promise]
Такое впечатление, что не дожидается результата. Почему так? Без функции срабатывает нормально, например, когда меняешь на результат асинхронного чтения. Получается функция в функции, из-за этого какие-то баги. Такое бывает в алерте с объектами, пробовал приводить к строке, не помогает.
|
|
29.05.2024, 14:39
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Ничего не понял, но очень интересно. ©
Без кода сложно сказать что вы делаете неправильно.
[object Promise] - результат приведения промиса к строке.
|
|
29.05.2024, 14:50
|
Интересующийся
|
|
Регистрация: 02.02.2024
Сообщений: 10
|
|
replace(/.../, async () => await fs.promises.readFile...
когда console.log , норм резы, а с return заменяет на канитель
Последний раз редактировалось Steh, 29.05.2024 в 14:53.
|
|
29.05.2024, 14:52
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Steh, где вы взяли функцию replace?
Вы уверены, что она может принимать вторым аргументом Promise?
Может стоит попробовать так?
readFile.then(content => replace(/../, content)).then(console.log);
|
|
29.05.2024, 14:55
|
Интересующийся
|
|
Регистрация: 02.02.2024
Сообщений: 10
|
|
попробую с обычным чтением
|
|
29.05.2024, 15:26
|
Интересующийся
|
|
Регистрация: 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'));
подводит последний фрагмент
|
|
29.05.2024, 16:07
|
|
Профессор
|
|
Регистрация: 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')
}
|
|
29.05.2024, 16:18
|
Интересующийся
|
|
Регистрация: 02.02.2024
Сообщений: 10
|
|
спасибо за совет, через match могу сделать, интересовала причина. Ну, видимо, так устроено
|
|
29.05.2024, 16:43
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,745
|
|
Сообщение от Steh
|
Ну, видимо, так устроено
|
Конечно. В данном случае задается cfllback функция, которая будет, когда надо, вызываться из функции replace. И вызываться она будет без await. И возвращать не строку, а промис.
|
|
29.05.2024, 21:37
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,585
|
|
Если ты в ноде, то можешь использовать readFileSync, хотя это и не рекомендуется.
Реплейсить в несколько проходов в любом случае - не стоит. По простому я бы сделал arr = base.split(/\{% (.*?) %\}/g) и проход через for(let i=1; i < arr.length; i+=2) { ... }.
Ну и в принципе если ты свой шаблонизатор пишешь который в теории будет усложняться, то лучше сразу без регулярок обойтись - "по взрослому" делать ast и\или конечный автомат.
__________________
29375, 35
|
|
|
|