Javascript jsReport如何使用AJAX get请求动态获取数据?
我想使用jsreport在我的网站(asp.net核心应用程序)上动态生成一些报告,我在控制器中有一个返回JSON的方法,我想使用jsreport从那里获取数据以填充报告 我将发布一些测试值。 控制器Javascript jsReport如何使用AJAX get请求动态获取数据?,javascript,jquery,ajax,asp.net-core,jsreport,Javascript,Jquery,Ajax,Asp.net Core,Jsreport,我想使用jsreport在我的网站(asp.net核心应用程序)上动态生成一些报告,我在控制器中有一个返回JSON的方法,我想使用jsreport从那里获取数据以填充报告 我将发布一些测试值。 控制器 public JsonResult testReport() { FileStream fs = new FileStream("path\\json.txt", FileMode.Open); using (StreamReader r = new Strea
public JsonResult testReport()
{
FileStream fs = new FileStream("path\\json.txt", FileMode.Open);
using (StreamReader r = new StreamReader(fs))
{
var model = r.ReadToEnd();
test json = JsonConvert.DeserializeObject<test>(model);
return Json(json);
}
}
[HttpGet]
public async Task<IActionResult> MyAction([FromServices] INodeServices nodeServices)
{
var result = await nodeServices.InvokeAsync<byte[]>
("./pdf");
HttpContext.Response.ContentType = "application/pdf";
string filename = @"report.pdf";
HttpContext.Response.Headers.Add("x-filename", filename);
HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "x-filename");
HttpContext.Response.Body.Write(result, 0, result.Length);
return new ContentResult();
}
我已经用硬编码和值进行了检查,它是有效的,当涉及到动态获取数据时,我遇到了问题。获取数据只是另一个异步任务,因此将其包含在承诺链中,以便将数据传递到需要的地方 假设您正在使用
fetch()
获取数据
module.exports = function () {
var jsreport = require('jsreport-core')();
return jsreport.init()
.then(function() {
return fetch({/* params */})
})
.then(function(fetchedData) {
return jsreport.render({
template: {
content: 'template bla bla bla',
engine: 'jsrender',
recipe: 'phantom-pdf'
},
data: fetchedData
});
});
};
注意:
回调
的所有内容均已删除。通过从函数返回承诺,调用者可以链接。然后(…).catch(…)无需传递回调(至少,不以相同的方式)即可调用函数 我设法解决了这个问题。问题是我试图在服务器上运行客户端脚本,这实际上毫无意义。因此,我通过在服务器上运行的脚本中发出get请求来修复它。最终结果:
module.exports = function (callback) {
var request = require("request");
var getResponse = null;
request.get({
url: '/Home/testReport',
json: true,
}, function (error, response, body) {
if (!error && response.statusCode == 200)
getResponse = body;
});
var jsreport = require('jsreport-core')();
jsreport.init().then(function () {
return jsreport.render({
template: {
content: 'template bla bla bla',
engine: 'jsrender',
recipe: 'phantom-pdf'
},
data: getResponse
}).then(function (resp) {
callback(/* error */ null, resp.content.toJSON().data);
});
}).catch(function (e) {
callback(/* error */ e, null);
});
}) 您好,我想知道$.get('Home/testReport',{},函数(…)将去哪里,以便从URL获取数据。如果这是一个愚蠢的问题,很抱歉,但这是jquery/jsp的第一次,javascript应该在哪里运行?这个问题在模块中令人困惑。exports
和require
暗示服务器端Node.js,ASP.new core
标记暗示ASP,现在您提到的$.get()
暗示客户端javascript。我的回答假设Node.js。我明白你的意思,我不匹配这些脚本的执行位置。谢谢1mirel,这段代码可能已经测试过了,但它非常脆弱——这不是一个可靠的解决方案request.get()
是异步的,正如jsreport.init()
一样。无法保证哪一个会首先响应-可能是a…b或b…a。您确实可以并行启动这两个异步进程,但在尝试渲染之前,需要使用以等待这两个进程都解决。
module.exports = function (callback) {
var request = require("request");
var getResponse = null;
request.get({
url: '/Home/testReport',
json: true,
}, function (error, response, body) {
if (!error && response.statusCode == 200)
getResponse = body;
});
var jsreport = require('jsreport-core')();
jsreport.init().then(function () {
return jsreport.render({
template: {
content: 'template bla bla bla',
engine: 'jsrender',
recipe: 'phantom-pdf'
},
data: getResponse
}).then(function (resp) {
callback(/* error */ null, resp.content.toJSON().data);
});
}).catch(function (e) {
callback(/* error */ e, null);
});