- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 electro/node.js 应用程序,但我遇到了问题。具体来说,我需要通过更新 DOM 中的元素向用户提供有关同步生成长循环进度的一些反馈。然而,实际显示的内容在循环期间不会改变。整个循环完成后,该元素会更新为最终的 max
指数值。
function dosomething(index,callback) {
childProcess.spawnSync('app1',... //takes 1 second
childProcess.spawnSync('app2',... //takes 6 seconds, depends on app1 running 1st
console.log('working on: ' + index);
callback(index);
}
function dosomethingelse(index) {
$('#somediv').html(index); //update progress bar
console.log('displaying: ' + $('#somediv').html());
}
for(var i=0; i<max; i++){ //max is usually 10-100, loop takes 1 to 10 minutes
dosomething(i,dosomethingelse);
}
当我将进度 html 转储到控制台时,它会以索引作为回调递增:
CONSOLE:
working on: 0
displaying: 0
working on: 1
displaying: 1
working on: 2
displaying: 2
...
此外,我尝试通过运行以下代码来强制重绘 div,但无济于事:
function dosomethingelse(index) {
$('#somediv').html(index); //update progress bar
console.log($('#somediv').html());
//REDRAW
document.getElementById("somediv").innerHTML =num;
document.getElementById("somediv").style.display = 'none';
document.getElementById("somediv").offsetHeight;
document.getElementById("somediv").style.display = 'block';
}
据我所知,使用spawnSync使我的二进制应用程序在nodejs上以阻塞模式运行。这直接针对 Node 的非阻塞核心,但在我的情况下绝对必要,因为我的命令行调用运行 6 秒并占用几乎 100% 的 CPU。如果我改用标准的异步生成,我最终会同时运行 50 个 100% 的进程,并在几分钟后大约在同一时间完成。同样,没有向用户提供进度反馈。我不明白为什么我的回调没有完成。如果我切换功能以便 dosomethingelse
首先用 dosomething
调用回调后,我仍然没有收到 DOM 更新。
我尝试过的另外两件事:npm sleep :
dosomething(i);
var sleep = require('sleep');
sleep.usleep(100);
dosomethingelse(i);
和deasync :
var deasync = require('deasync');
deasync(dosomething(i));
dosomethingelse(i);
相同的结果。另外,如果我拿出我的长跑dosomething
函数并将其替换为 sleep.sleep(3)
我得到同样的结果。 Node 只是从一个阻塞任务转到下一个阻塞任务,而不更新 UI。
最佳答案
您似乎只担心同时运行太多异步进程。但实际上,您可以控制同时运行多少个。
例如像这样:
function runTask(tasks, index, callback) {
if (index >= tasks.length) {
callback();
}
tasks[index](() => runTask(tasks, index + 1, callback));
}
function queue(tasks, callback) {
runTask(tasks, 0, callback);
}
有了这个,您将有一个简单的方法来对异步生成进行排队:
const spawn = require('child_process').spawn;
function customSpawn(command, args) {
return callback => {
const child = spawn(command, args);
child.on('close', callback);
}
}
queue([customSpawn('app1', []), customSpawn('app2', [])], dosomethingelse);
我从未测试过上述任何代码,因此我不能保证其正确性。
此外,如果您想摆脱所有这些回调,请查看 Promise 和生成器。
例如,对于 Promise,它可能看起来像这样:
function queue(tasks) {
let index = 0;
const runTask = arg => {
if (index >= tasks.length) {
return Promise.resolve(arg);
}
return new Promise((resolve, reject) => {
tasks[index++](arg).then(arg => resolve(runTask(arg))).catch(reject);
});
};
return runTask();
}
const spawn = require('child_process').spawn;
function customSpawn(command, args) {
return () => new Promise((resolve, reject) => {
const child = spawn(command, args);
child.on('close', code => {
if (code === 0) {
resolve();
} else {
reject();
}
});
});
}
queue([customSpawn('app1', []), customSpawn('app2', [])])
.then(dosomethingelse)
.catch(err => console.error(err));
关于 for 循环的注意事项:首先使用闭包构建您想要执行的操作的队列,如 customSpawn
中所示,然后将其传递给 queue
。
关于javascript - DOM 重绘被 childProcess.spawnSync 阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38517098/
我遇到了一个问题,spawnSync 通过简单的“npm install”给我 ENOENT。有人可以帮帮我吗? ======= Node 脚本 ========== var child = requ
我想在 ES6 async/await 中终止 spawnSync 进程。 (async () => { const type = 'python'; const exefile
在执行以下行时,错误“ spawnSync/bin/sh ENOBUFS ”在我的 NodeJs 应用程序中非系统地产生: child_process.execSync(`cd /tmp/myFold
在使用 execSync 执行命令(使用 sh 执行)后,我注意到以下内容: spawnSync/bin/sh ENOENT bin 当前已添加到 PATH。 有什么想法吗? 最佳答案 一般是因为你执
我认为这会很简单,但下面的操作并不像预期的那样。 我想将数据通过管道传输到一个进程,比如说(只是一个任意命令用于说明)wc,来自 Node。 docs及其他SO questions似乎表明传递 Str
我希望能够在子进程中运行时显示命令输出,然后在我的程序中处理输出。这可能吗? var result = spawnSync('neo', ['-help'], { stdio: 'inheri
我有一个 electro/node.js 应用程序,但我遇到了问题。具体来说,我需要通过更新 DOM 中的元素向用户提供有关同步生成长循环进度的一些反馈。然而,实际显示的内容在循环期间不会改变。整个循
我收到这个错误: Error: spawnSync undefined ENOENT 总是,当我在 VSCode 中保存文件时,结果编译正常。 我该如何解决这个问题? 我读了这个: How do I
该应用程序使用R代码计算两个输入整数的指数之和。输入通过node.js的child_process.spawnSync API以JSON对象的形式传递到R代码。 该应用程序是使用 Electron 打
是否有一种简单的方法来捕获 child_process spawnSync 或 execSync stdout/stderr?几年前我看到其他帖子说当时不可能,因为它是同步的。 我遇到了一个问题,我需
我想使用以下命令通过提升的 PowerShell 控制台安装 Windows 构建工具: npm install --global --production windows-build-tools 但
我同步生成一些命令并想要两件事: 将其标准输出通过管道传输到 process.stdout。 将标准输出保存到变量中。 我写了这段代码: var spawnSync = require('child_
我正在尝试从 gulp 任务运行“npm publish”。它有效,但我想处理 npm 命令本身抛出的任何错误。 如果我执行这段代码: var cmd = spawnSync('npm.cmd', [
我正在尝试在 TFS Online 的进程中构建 Windows 服务和存档文件。存档文件任务因此不明确的错误而失败。任何指示将不胜感激。 最佳答案 我今天也遇到了同样的问题。 已修复 右键单击解决方
我的ReactNative应用程序在Iphone模拟器上运行良好,但是当我尝试通过USB在我的Android移动设备上运行它时,抛出此错误。 > Task :app:installDe
我开始在 ReactXP 中编写代码,我需要让 React-Native 在 Android 设备上工作,但我无法测试它,因为在命令 react-native run-android 结束时发生错误。
首先我会发布我的代码, 我将举例说明我面临的问题: for(var i=0;i
我目前正在使用 spawnSync 和 stdio:inherit 将日志打印在我的控制台上。但是,我正在寻找将自定义日志记录到单独的文件,以防万一在生成期间出现任何故障。 我想创建一个包装器 spa
有一段时间以来,我一直在尝试达成一些目前对我来说还行不通的事情。 对于 nodejs,我喜欢运行交互式 sh-command 并在命令退出后使用 sh-command 输出。我喜欢编写一个可生成的生成
var childProcess = cp.spawnSync(command, args, { cwd: process.cwd(), env: process.env, s
我是一名优秀的程序员,十分优秀!