经营一个;背景任务“;在javascript中

经营一个;背景任务“;在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

在Javascript中,是否可以在后台运行函数

我正在angularJS应用程序中使用pdfmake工具生成pdf,但pdf生成相当长(3-4秒),在此期间,ui完全冻结

我想运行后台任务并强制下载pdf,而不冻结用户界面,是否可能

下面是我如何运行pdfmake(
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的库(我需要一个将内容生成和文件下载分开的库,目前我还没有找到任何库)