Javascript 在node.js中运行后台任务
如何在node.js中运行后台任务?这样我就可以并行地同时执行多个请求,而不会阻塞UI。一旦请求完成,我可以通知用户操作已完成,结果已准备就绪。当处理一个请求时,最终用户也可以自由执行其他操作Javascript是单线程的,因此您的程序必须是异步的。Javascript使用事件(回调、超时)来协调许多快速函数调用的运行。Nodejs没有要阻止的UI,但是这些快速函数可以被慢速函数阻止。Javascript的这种异步特性同时适用于NodeJ和浏览器代码 我相信你的问题是关于如何处理耗费大量时间的操作 一种方法是将这些操作分解成许多块(快速函数调用),并让每个操作使用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和浏览器代码 我相信你的问题是关于如何处理耗费大量时间的操
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本质上是异步的”-你想说“单线程”。