Сейчас я начинаю с javascript. Я ищу совет или руководство, так как не могу продвинуться дальше. Нужно ли мне сохранять результат строки 70 console.info(html) в переменной (const, let или var)? Есть какие-нибудь советы, как это сделать? Я попробовал аргументы и возврат в функции runRtfjs, но это не сработало. Мне нужно сохранить его в переменной, чтобы позже отобразить в HTML.
const jsdom = require("jsdom");
const {JSDOM} = jsdom;
const filertf =
`{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Calibri;}}
{\\*\\generator Msftedit 5.41.21.2510;}\\viewkind4\\uc1\\pard\\sa200\\sl276\\slmult1\\lang9\\f0\\fs22 This \\fs44 is \\fs22 a \\b simple \\ul one \\i paragraph \\ulnone\\b0 document\\i0 .\\par
}`;
function stringToArrayBuffer(string) {
const buffer = new ArrayBuffer(string.length);
const bufferView = new Uint8Array(buffer);
for (let i = 0; i < string.length; i++) {
bufferView[i] = string.charCodeAt(i);
}
return buffer;
}
function runRtfjs(rtf, callback, errorCallback) {
const virtualConsole = new jsdom.VirtualConsole();
virtualConsole.sendTo(console);
new JSDOM(`
<script src = "./node_modules/rtf.js/dist/WMFJS.bundle.js"></script>
<script src = "./node_modules/rtf.js/dist/EMFJS.bundle.js"></script>
<script src = "./node_modules/rtf.js/dist/RTFJS.bundle.js"></script>
<script>
RTFJS.loggingEnabled(false);
WMFJS.loggingEnabled(false);
EMFJS.loggingEnabled(false);
try {
const doc = new RTFJS.Document(rtfFile);
const meta = doc.metadata();
doc.render().then(function(htmlElements) {
const div = document.createElement("div");
div.append(...htmlElements);
window.done(meta, div.innerHTML);
}).catch(error => window.onerror(error))
} catch (error){
window.onerror(error)
}
</script>
`, {
resources: "usable",
runScripts: "dangerously",
url: "file://" + __dirname + "/",
virtualConsole,
beforeParse(window) {
window.rtfFile = stringToArrayBuffer(rtf);
window.done = function (meta, html) {
callback(meta, html);
};
window.onerror = function (error) {
errorCallback(error);
};
}
});
};
runRtfjs(
filertf,
(meta, html) => {
//console.info("Meta:");
//console.info(meta);
//console.info("Html:");
console.info(html);
},
error => console.error(error)
);
Я попробовал аргументы и возврат в функции runRtfjs, но это не сработало.
Отвечает ли это на ваш вопрос? Как вернуть ответ на асинхронный вызов?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Объявите переменную вне функции для хранения результата. Измените функцию runRtfjs, чтобы установить переменную с содержимым HTML. Используйте переменную после выполнения функции.
Объявите переменную вне области действия функции и присвойте ей значение.
Если его нужно повторно использовать в той же области, вы можете использовать let вместо var.
var htmlData;
runRtfjs(
filertf,
(meta, html) => {
htmlData = html;
console.info(html);
},
error => console.error(error)
);
var возвращается как неопределенная var htmlData; runRtfjs( filertf, (meta, html) => { htmlData = html; }, error => console.error(error) ); console.info(htmlData)
Это потому, что вы получаете доступ к переменной еще до того, как ваша функция записала в нее данные. Любой код, использующий результат, должен находиться в обратном вызове, как изначально был ваш console.info, чтобы он мог запуститься после завершения вашей функции, а не сразу.
Это уже есть в переменной, она называется
html. Я думаю, ваша проблема в том, что вы еще не понимаете асинхронность.