Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在node.js中运行后台任务_Javascript_Node.js_Concurrency_Long Running Processes - Fatal编程技术网

Javascript 在node.js中运行后台任务

Javascript 在node.js中运行后台任务,javascript,node.js,concurrency,long-running-processes,Javascript,Node.js,Concurrency,Long Running Processes,如何在node.js中运行后台任务?这样我就可以并行地同时执行多个请求,而不会阻塞UI。一旦请求完成,我可以通知用户操作已完成,结果已准备就绪。当处理一个请求时,最终用户也可以自由执行其他操作Javascript是单线程的,因此您的程序必须是异步的。Javascript使用事件(回调、超时)来协调许多快速函数调用的运行。Nodejs没有要阻止的UI,但是这些快速函数可以被慢速函数阻止。Javascript的这种异步特性同时适用于NodeJ和浏览器代码 我相信你的问题是关于如何处理耗费大量时间的操

如何在node.js中运行后台任务?这样我就可以并行地同时执行多个请求,而不会阻塞UI。一旦请求完成,我可以通知用户操作已完成,结果已准备就绪。当处理一个请求时,最终用户也可以自由执行其他操作

Javascript是单线程的,因此您的程序必须是异步的。Javascript使用事件(回调、超时)来协调许多快速函数调用的运行。Nodejs没有要阻止的UI,但是这些快速函数可以被慢速函数阻止。Javascript的这种异步特性同时适用于NodeJ和浏览器代码

我相信你的问题是关于如何处理耗费大量时间的操作

一种方法是将这些操作分解成许多块(快速函数调用),并让每个操作使用
setTimeout()
启动下一个操作。在不了解长时间运行功能的情况下,很难建议如何执行此操作。这里有一个关于这个话题的问题和一些答案

总结答案时,您可以使用这种代码

function (data, callbackWhenDone) {
  let n = 0
  const max = data.length;
  const batchSize = 100;
  try {   
    function doBatch () {
        let i
        for (var i = 0; i < batch && n < max; ++i, ++n) {
           doComputation(data[n])
        }
        if (n < max) setTimeout(doBatch, 0)
        else callbackWhenDone(null, data)
    }
  } catch (error) {
    callbackWhenDone(error)
  }
  doBatch()
}
函数(数据、回调时内通){
设n=0
const max=data.length;
常数batchSize=100;
试试{
函数doBatch(){
让我
对于(变量i=0;i
批处理结束时的
setTimeout(fn,0)
通过在Javascript的主循环中排队等待超时来启动下一批处理。该队列中的其他项目有机会运行。每个批处理都知道从何处开始,因为
doBatch()
函数在运行时会更新
n
。当整个批次完成时,它将调用您传入的回调。回调使用典型的nodejs模式,其中第一个参数(如果不是null)是一个错误


另一种方法是使用。您可以将计算的Javascript代码放在单独的Javascript上下文中并运行它。您将需要将数据从主nodejs进程来回传递到线程的技巧。在尝试此操作之前,请确保有可靠的调试器设置;Javascript是单线程的,所以你的程序必须是异步的。Javascript使用事件(回调、超时)来协调许多快速函数调用的运行。Nodejs没有要阻止的UI,但是这些快速函数可以被慢速函数阻止。Javascript的这种异步特性同时适用于NodeJ和浏览器代码

我相信你的问题是关于如何处理耗费大量时间的操作

一种方法是将这些操作分解成许多块(快速函数调用),并让每个操作使用
setTimeout()
启动下一个操作。在不了解长时间运行功能的情况下,很难建议如何执行此操作。这里有一个关于这个话题的问题和一些答案

总结答案时,您可以使用这种代码

function (data, callbackWhenDone) {
  let n = 0
  const max = data.length;
  const batchSize = 100;
  try {   
    function doBatch () {
        let i
        for (var i = 0; i < batch && n < max; ++i, ++n) {
           doComputation(data[n])
        }
        if (n < max) setTimeout(doBatch, 0)
        else callbackWhenDone(null, data)
    }
  } catch (error) {
    callbackWhenDone(error)
  }
  doBatch()
}
函数(数据、回调时内通){
设n=0
const max=data.length;
常数batchSize=100;
试试{
函数doBatch(){
让我
对于(变量i=0;i
批处理结束时的
setTimeout(fn,0)
通过在Javascript的主循环中排队等待超时来启动下一批处理。该队列中的其他项目有机会运行。每个批处理都知道从何处开始,因为
doBatch()
函数在运行时会更新
n
。当整个批次完成时,它将调用您传入的回调。回调使用典型的nodejs模式,其中第一个参数(如果不是null)是一个错误


另一种方法是使用。您可以将计算的Javascript代码放在单独的Javascript上下文中并运行它。您将需要将数据从主nodejs进程来回传递到线程的技巧。在尝试此操作之前,请确保有可靠的调试器设置;这可能会令人困惑。

“Javascript本质上是异步的”-你想说“单线程”。“Javascript本质上是异步的”-你想说“单线程”。