- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我制作了一个简单的应用程序,它的 UI 显示一个输入文本和两个按钮:获取和显示。
总体思路是在用户输入一个单词并单击“获取”后该应用程序将从 Datamuse API 请求 Meaning Like 单词,并以 JSON 格式返回单词及其标签(名词、动词、形容词...)。
我希望如果应用程序成功获取这些单词,那么成功文本将位于名为“fetchStatus”的变量中。
之后,我希望“fetchStatus”的值将在 res.render 中传输到具有 UI 代码的 index.ejs,以便用户可以查看从 Datamuse 获取是否成功。
运行提取的函数称为“FetchData(req.body.wordInput)”。
问题在于 res.render 函数在 FetchData 函数之前运行,因此 fetchStatus 值为空字符串。
在函数 FetchData 中,我尝试返回字符串并将其传递给 res.render 但没有成功。
如果我将“fetchStatus”作为参数或全局变量,也会发生同样的情况。
app.js
============
//jshint esversion:6
var fetchStatus = "";
var vocabularyTags = {
syn: {name:"synonym", freq:0},
n: {name:"noun", freq:0},
v: {name:"verb", freq:0},
adj:{name:"adjective", freq:0},
adv:{name:"adverb", freq:0},
u:{name:"undetermined", freq:0},
prop: {name:"propery", freq:0}
};
const express = require("express");
const bodyParser = require("body-parser");
const request = require("request");
var app = express();
// Setting ejs
app.set('view engine', 'ejs');
// Setting body-parser
app.use(bodyParser.urlencoded({ extended: true }));
app.get("/",function(req,res){
// res.sendFile(__dirname+"/index.html");
res.render("index", {fetchStatus:"", vocabularyTags:{}});
});
app.post("/",function(req,res){
// var fetchStatus = "";
var buttonPressed = req.body.submit;
if (buttonPressed === "fetch") {
FetchData(req.body.wordInput);
console.log("Fetch Status: "+fetchStatus);
res.render("index",{ fetchStatus:fetchStatus ,vocabularyTags:{} });
}
else if (buttonPressed === "show") {
//ShowData();
var vocabularyTagsResults = vocabularyTags;
res.render("index",{fetchStatus:"" ,vocabularyTags:vocabularyTagsResults});
// Clear Vocabulary Tags Frequencies
for (var key in vocabularyTags) {
vocabularyTags[key].freq = 0;
}
}
});
app.listen(3000,function(){
console.log("Server is running on port 3000");
});
function FetchData(wordInput) {
// var fetchStatus = "";
var options = {
url:"https://api.datamuse.com/words",
method:"GET",
qs: {
ml: wordInput
}
};
request(options,function(error,response,body){
if (error) {
fetchStatus = error;
}
else {
var dataMuseML = JSON.parse(body);
console.log(dataMuseML);
// Counting the related tags
dataMuseML.forEach(function(item){
var tags = item.tags;
tags.forEach(function(tag){
vocabularyTags[tag].freq++;
});
});
fetchStatus = "Fetch from Datamuse API has succeeded!";
}
});
// return fetchStatus;
}
views/index.ejs
================
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Datamuse API</title>
</head>
<body>
<h1>Datamuse API</h1>
<form action="/" method="post">
<input type="text" name="wordInput" placeholder="Enter a word...">
<button type="submit" name="submit" value="fetch">Fetch</button>
<button type="submit" name="submit" value="show">Show</button>
</form>
<h3> <%= fetchStatus %> </h3>
<% for (var key in vocabularyTags) { %>
<p> <span><%= vocabularyTags[key].name %>:</span> <span> <%= vocabularyTags[key].freq %></span> </p>
<% } %>
</body>
</html>
预期结果是“fetchStatus”将有成功或错误文本,因此我可以将其传递给 res.render,这会将其放入 index.ejs 中。
最佳答案
你应该使用Promise
来实现
function FetchData(wordInput) {
// var fetchStatus = "";
var options = {
url:"https://api.datamuse.com/words",
method:"GET",
qs: {
ml: wordInput
}
};
return new Promise((resolve, reject) => {
request(options,function(error,response,body){
if (error) {
reject(error);
}
else {
var dataMuseML = JSON.parse(body);
console.log(dataMuseML);
// Counting the related tags
dataMuseML.forEach(function(item){
var tags = item.tags;
tags.forEach(function(tag){
vocabularyTags[tag].freq++;
});
});
resolve("Fetch from Datamuse API has succeeded!");
}
});
});
// return fetchStatus;
}
然后你可以这样调用它:
app.post("/",function(req,res){
// var fetchStatus = "";
var buttonPressed = req.body.submit;
if (buttonPressed === "fetch") {
FetchData(req.body.wordInput).then(res => {
console.log("Fetch Status: "+res);
res.render("index",{ fetchStatus:res ,vocabularyTags:{} });
}).catch(err => {
console.log("Error: "+err);
res.render("index",{ fetchStatus:err ,vocabularyTags:{} });
})
}
// ...
}
如果您想将结果保留在全局中,您只需设置 fetchStatus,然后调用 resolve
和 then
即可,如下所示:
// ...
return new Promise((resolve, reject) => {
if (error) {
fetchStatus = error;
}
else {
// ...
fetchStatus = "Fetch from Datamuse API has succeeded!";
}
});
});
resolve(fetchStatus);
}
app.post("/",function(req,res){
if (buttonPressed === "fetch") {
FetchData(req.body.wordInput).then(res => {
// res or fetchStatus should be available here but it's better to use res
console.log("Fetch Status: "+res);
res.render("index",{ fetchStatus:res ,vocabularyTags:{} });
})
}
}
关于javascript - NodeJS - 如何使 res.render() 在函数之后运行而不是异步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57749520/
我需要在每个渲染帧完成后拍摄屏幕截图,但我发现某些屏幕截图是重复的,所以我想知道是否可以在渲染完成之前保存屏幕截图。因此... renderer.render() 会阻塞直到完成渲染吗? 如果没有,有
web.py 骨架代码中的“render._keywords['globals']['render'] = render”是什么意思? http://webpy.org/skeleton/0.3 最佳
所以在我的 Nuxt universal-mode 应用程序中,我有时会出现错误: vue.runtime.esm.js:620 [Vue warn]: The client-side rendere
我想创建一个 portal-like effect使用 Bevy . Unity 似乎有一个 render texture实现这一目标。 有没有办法在 Bevy 中做同样的事情?如果没有, futur
我有一个看起来像这样的组件(非常简化的版本): const component = (props: PropTypes) => { const [allResultsVisible, setA
编辑:我调整了代码,但问题仍然存在。见下文 我有这个 p:selectOneRadio : 而这个 p:radioButton : 和 AData包含其
为了渲染部分我可以使用 render 'partial_name' 或 render partial: 'partial_name' 我开始知道 render 是 render partial 的简写
我注意到文章中的一些地方使用了 React.render() 和一些地方 ReactDOM.render()。这两者有什么具体区别吗? 最佳答案 这是 0.14 中引入的最新更改。他们将 React
我的代码是这样的: function render() { renderer.render( scene, camera ); renderer.clear(); } 我想知道为什么它
我目前正在实现 useSWR 以便从我的 express 和 mongo-db 后端获取数据。我能够从数据库中成功获取数据没问题。以下是我用来实现此目的的代码: ```//SWR method for
我只有在按照 React native - "this.setState is not a function" trying to animate background color? 的建议合并了 u
所以我有一个大的纹理,被分成 64x64 block 。 我使用将其加载到 LibGDX texture = new Texture("texturemap.png"); regions = Text
我对放置 @Scripts.Render 和 @Styles.Render 的位置感到很困惑。理想情况下,我会将它们全部放在 head 部分中,但出乎意料的是,例如 @Scripts.Render("
我正在尝试使用 jamon 来收集使用 Tapestry 的网站的统计信息(呈现网页的时间)。 我怎样才能拥有 服务器收到请求时执行的方法,即渲染开始时? 响应全部发送完毕,即渲染结束时执行的方法 ?
在我的 React 应用程序中,我想要渲染一个 prop 值,但直到渲染完成后更新 props 后它才存在。 this.props.users 是一个对象,因此我使用 Object.keys() 转换
我正在使用 React 的钩子(Hook),我希望有一个从数据库中检索到的值作为初始值。但是,我收到以下错误: Invariant Violation: Invariant Violation: Re
我正在尝试按照以下代码将多个场景包含到单个 webgl 渲染器中: renderer.render(scene1, camera); renderer.render(scene2, camera);
我在我的 xhtml 页面中使用此代码,当我运行应用程序时,元描述仍在呈现。我想根据某些条件使用元描述标签。主布局: ..........
我正在使用react-native-render-html来渲染html。renderers方法允许我提供自定义函数来呈现特定标签。不过,我想使用源代码中的原始内部 HTML 将子组件替换为我的自定义
我有一个网格,可以渲染可变高度的卡片。 为了获取卡片的高度,我将卡片渲染在 ReactHeight 中。 ( https://github.com/nkbt/react-height ),这让我可以在
我是一名优秀的程序员,十分优秀!