经营一个;背景任务“;在javascript中
在Javascript中,是否可以在后台运行函数 我正在angularJS应用程序中使用pdfmake工具生成pdf,但pdf生成相当长(3-4秒),在此期间,ui完全冻结 我想运行后台任务并强制下载pdf,而不冻结用户界面,是否可能 下面是我如何运行pdfmake(经营一个;背景任务“;在javascript中,javascript,angularjs,pdfmake,Javascript,Angularjs,Pdfmake,在Javascript中,是否可以在后台运行函数 我正在angularJS应用程序中使用pdfmake工具生成pdf,但pdf生成相当长(3-4秒),在此期间,ui完全冻结 我想运行后台任务并强制下载pdf,而不冻结用户界面,是否可能 下面是我如何运行pdfmake(pdfmake和是自定义工厂): 您可以使用Web Worker生成PDF。但是在使用它们时,您应该注意一些限制。这是一个很好的参考 我在Angular创建了一个工厂,用于处理工人线程。大概是这样的: /* Here's an ex
pdfmake
和是自定义工厂):
您可以使用Web Worker生成PDF。但是在使用它们时,您应该注意一些限制。这是一个很好的参考
我在Angular创建了一个工厂,用于处理工人线程。大概是这样的:
/*
Here's an example on how to get this sack of moldering spuds to do something:
var myWorker = new MyWorker({ fn: function() {
this.onmessage = function(args) {
setTimeout(function() {
this.postMessage('Got args: ' + args.data);
}, 20000);
};
} });
myWorker.do('Test').then(function(message) {
alert(message);
});
*/
'use strict';
angular.module('myApp')
.factory('MyWorker', function($q) {
var _worker;
var MyWorker = function(settings) {
_init(settings);
};
MyWorker.prototype.do = function(args) {
var deferred = $q.defer();
_worker.onmessage = function(message) {
deferred.resolve(message.data);
};
//Fire up the blades.
if (args)
_worker.postMessage(args);
else
_worker.postMessage();
return deferred.promise;
};
MyWorker.prototype.destroy = function() {
_worker.terminate();
};
function _init(settings) {
if (settings.script)
_worker = new Worker(settings.script);
//Need to make this IE (10+) friendly.
else if (settings.fn) {
var blobUrl = window.URL.createObjectURL(new Blob(
['(', settings.fn.toString(), ')()'],
{ type: 'application/javascript' }
));
_worker = new Worker(blobUrl);
}
};
return MyWorker;
});
这将使您大致了解如何在AngularJS中实现它,但请认真对待。您可以使用Web Worker生成PDF。但是在使用它们时,您应该注意一些限制。这是一个很好的参考
我在Angular创建了一个工厂,用于处理工人线程。大概是这样的:
/*
Here's an example on how to get this sack of moldering spuds to do something:
var myWorker = new MyWorker({ fn: function() {
this.onmessage = function(args) {
setTimeout(function() {
this.postMessage('Got args: ' + args.data);
}, 20000);
};
} });
myWorker.do('Test').then(function(message) {
alert(message);
});
*/
'use strict';
angular.module('myApp')
.factory('MyWorker', function($q) {
var _worker;
var MyWorker = function(settings) {
_init(settings);
};
MyWorker.prototype.do = function(args) {
var deferred = $q.defer();
_worker.onmessage = function(message) {
deferred.resolve(message.data);
};
//Fire up the blades.
if (args)
_worker.postMessage(args);
else
_worker.postMessage();
return deferred.promise;
};
MyWorker.prototype.destroy = function() {
_worker.terminate();
};
function _init(settings) {
if (settings.script)
_worker = new Worker(settings.script);
//Need to make this IE (10+) friendly.
else if (settings.fn) {
var blobUrl = window.URL.createObjectURL(new Blob(
['(', settings.fn.toString(), ')()'],
{ type: 'application/javascript' }
));
_worker = new Worker(blobUrl);
}
};
return MyWorker;
});
这将使您大致了解如何在AngularJS中实现它,但请认真对待。什么是创建的(数据)。下载do?我很好奇你是否正在使用一个同步的
调用来做这件事(糟糕)。我是,我想知道如何使它异步,我将用完整的生成代码更新这个问题我已经更新了我的问题,create()
函数只是同步的pdfmake.createPdf()
的包装,我的所有数据都已从ui网格表中加载和缓存。创建什么(数据)。下载
做什么?我很好奇你是否正在使用一个同步的
调用来做这件事(糟糕)。我是,我想知道如何使它异步,我将用完整的生成代码更新这个问题我已经更新了我的问题,create()
函数只是同步的pdfmake.createPdf()
的包装,我所有的数据都已经从ui网格表中加载和缓存了。我明天早上会看一看:)但这似乎确实是正确的方法。最大的问题是使用视图的pdfmake依赖关系。文档在worker中是不允许的:/我已经接受了你的答案,因为我的问题只是关于“后台任务”事实上,它是正确的,但在我的例子中,pdf生成有点困难,因为我需要一个不使用window.document
来构建pdf的库(我需要一个拆分内容生成和文件下载的库,目前我还没有找到)明天早上我会看一看:)但这似乎确实是正确的方法。最大的问题是使用视图的pdfmake依赖性。worker中不允许使用的文档
:我接受了你的答案,因为我的问题只是关于“后台任务”,而且确实是正确的,但在我的例子中,pdf生成有点困难,因为我需要一个不使用window.document
来构建pdf的库(我需要一个将内容生成和文件下载分开的库,目前我还没有找到任何库)