我同时开始使用MathJax和使用await,在其中我格式化一系列可以包含数学的行。数学由定界符$...$
表示。
问题::我需要等待MathJax完成其转换(我确实获得了某种html输出),但是转换没有在等待,其余format()
正在执行。我的部分代码是根据question中给出的答案建模的。
function MJ(math) {
// as per the documentation, this returns a promise if no callback is set
return mathjax.typeset({
math: math,
format: "inline-TeX",
html: true,
});
}
async function convert(line) {
var re = /\$(.*?)\$/;
var match = re.exec(line)[0];
var math = match.slice(1, -1);
// ORIGINAL CODE
// let result = await MJ(math).then(function(data){return line.replace(match,data.html);});
// return result;
let result = await MJ(math);
console.log(`MJ is ready: ${result.html}`);
return line.replace(match, result.html);
}
function format(line) {
if(line.indexOf("$")>-1){
line = convert(line).then( function(result) {
console.log(result);
return result;
});
console.log(line);
}
// additional formatting going below that needs to wait for the mathjax conversion
}
错误输出(部分被截断)
(node:17104) DeprecationWarning: Mongoose: mpromise (mongoose's default promise
library) is deprecated, plug in your own promise library instead: http://mongoos
ejs.com/docs/promises.html
Promise { <pending> }
TypeError: line.indexOf is not a function
at emphasis (C:\something\routes\index.js:91:18)
at format (C:\something\routes\index.js:139:12)
at C:\something\routes\index.js:803:25
at newTickHandler (C:\something\node_modules\m
promise\lib\promise.js:234:18)
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
MJ is ready: <span class="mjx-chtml"><span class="mjx-math" etc.
<span class="mjx-chtml"><span class="mjx-math" etc.
正在调用格式(行[x])的地方
警告:不是最漂亮的代码。无需赘述,我有由“片段”组成的“模块”,其中包含我需要分组在一起以形成一个连贯文本的文本。
lines [x]由看起来像这样的字符串组成:“爱因斯坦表明$ E = mc ^ 2 $。”
app.get('/flashcards/module/:id', isAuthenticated, function(req, res){
var moduleid = new ObjectId(req.params.id);
var user = new ObjectId(req.session.user);
var categoryid = new ObjectId(req.query.categoryid);
var back = "";
var html, lines;
var index = 0;
var indexoflastline = 0;
var active = false;
var moduletitle = "";
Modules.findOne( { _id: moduleid } )
.then(function(module) {
moduletitle = module.title;
return Snippets.find( { _id: module.snippets } ).sort({order: 1})
})
.then(function(snippets){
if(snippets){
for (var i = 0; i < snippets.length; i++) {
if(snippets[i].suppresstext == true) {
snippets.splice(i,1);
i-=1;
}
}
html = "<ul>";
for(var i = 0; i < snippets.length; i++) {
if(i==0) {
lines = snippets[i].main.split('\n').clean('');
for(var x = 0; x < lines.length; x++){
if(checkindex(lines[x])==indexoflastline) {
html += "<li>";
html += format(lines[x]);
html += "</li>";
} else if (checkindex(lines[x])>indexoflastline) {
html += "<ul>";
html += "<li>";
html += format(lines[x]);
html += "</li>";
indexoflastline += 1;
} else if (checkindex(lines[x])<indexoflastline){
html += "</ul>".repeat(indexoflastline-checkindex(lines[x]));
html += "<li>";
html += format(lines[x]);
html += "</li>";
indexoflastline -= indexoflastline-checkindex(lines[x]);
}
}
indexoflastline = -1;
}
if(i>0){
if(snippets[i].main!=snippets[i-1].main){
html += "</ul>".repeat(indexoflastline+1);
lines = snippets[i].main.split('\n').clean('');
if(lines) {
for(var x = 0; x < lines.length; x++){
if(checkindex(lines[x])==indexoflastline+1) {
html += "<li>";
html += format(lines[x]);
html += "</li>";
} else if (checkindex(lines[x])>indexoflastline+1) {
html += "<ul>";
html += "<li>";
html += format(lines[x]);
html += "</li>";
indexoflastline += 1;
} else if (checkindex(lines[x])<indexoflastline+1){
html += "</ul>".repeat(indexoflastline+1-checkindex(lines[x]));
html += "<li>";
html += format(lines[x]);
html += "</li>";
indexoflastline = indexoflastline-checkindex(lines[x]);
}
}
// indexoflastline = -1;
}
} else if (snippets[i].main==snippets[i-1].main){
// index of snippet from previous snippet
lines = snippets[i-1].subinformation.split('\n').clean('');
indexoflastline = checkindex(lines[lines.length-1]);
if(indexoflastline===undefined)
indexoflastline = -1;
indexoflastline = checkindex(lines[lines.length-1])+1 ? checkindex(lines[lines.length-1]) : -1;
}
}
lines = snippets[i].subinformation.split('\n').clean('');
if(lines){
for(var x = 0; x < lines.length; x++){
if(indexoflastline==-1) {
html += "<ul>";
html += "<li>";
html += format(lines[x]);
html += "</li>";
indexoflastline = 0;
} else if(checkindex(lines[x])==indexoflastline) {
html += "<li>";
html += format(lines[x]);
html += "</li>";
} else if (checkindex(lines[x])>indexoflastline) {
html += "<ul>";
html += "<li>";
html += format(lines[x]);
html += "</li>";
indexoflastline += 1;
} else if (checkindex(lines[x])<indexoflastline){
html += "</ul>".repeat(indexoflastline-checkindex(lines[x]));
html += "<li>";
html += format(lines[x]);
html += "</li>";
indexoflastline -= indexoflastline-checkindex(lines[x]);
}
if(x==lines.length-1 && i < snippets.length-1) {
if (snippets[i].main == snippets[i+1].main){
indexoflastline = checkindex(lines[x]);
} else if (x==lines.length-1) {
html += "</ul>".repeat(indexoflastline+1);
indexoflastline = -1;
}
}
}
} else if (snippets[i].main == snippets[i+1].main) {
if(x==lines.length-1 && i < snippets.length-1) {
indexoflastline = checkindex(lines[x]);
if (x==lines.length-1) {
html += "</ul>".repeat(indexoflastline+1);
indexoflastline = -1;
}
}
}
}
if(i == snippets.length-1){
for(var z = indexoflastline; z > 0; z--)
html +="</ul>";
}
html += "</ul>"
html += "</br>".repeat(2);
return Categories.findOne( { _id: categoryid } );
})
.then(function(category) {
back = `/flashcards/${category.parent}`;
return userCategories.findOne( { category: categoryid, user: user } );
})
.then(function(userCategory) {
res.render('user/flashcards/module', {
moduleid: moduleid,
moduletitle: moduletitle,
back: back,
htmlstring: html,
selected: userCategory.active,
admin: req.session.admin,
categoryid: categoryid
});
return true;
})
.catch(function(err){
if(err)
return console.log(err);
});
});
答案 0 :(得分:0)
代替混合await
和Promise,像这样尝试。调试行是否正确打印?
let data = await MJ(math);
console.log("MJ is ready: ${data}");
return line.replace(match, data.html);
答案 1 :(得分:0)
您正在将Promise和await
混在一起。不要那样您无法理解自己的代码。这是您的错误:
line = convert(line).then( function(result) {
console.log(result);
return result;
});
console.log(line); // This is called before convert() finishes, of course it's a pending promise.
要么将=
与await
一起使用,要么使用promise并使用then
分辨率中的返回值。
line = await convert(line);
console.log(line);