Javascript 如何从forEach循环中实现一个平坦的承诺数组?
我正试图利用一系列承诺(通过Q&node子进程承诺库),利用Windows WMIC命令提取驱动器号、可用空间和总大小,如下所示:Javascript 如何从forEach循环中实现一个平坦的承诺数组?,javascript,promise,q,Javascript,Promise,Q,我正试图利用一系列承诺(通过Q&node子进程承诺库),利用Windows WMIC命令提取驱动器号、可用空间和总大小,如下所示: var stdout = ''; var exec = require('child-process-promise').exec; exec('wmic logicaldisk where drivetype=3 get caption', { capture: ['stdout', 'stderr'] }) .then(function(result)
var stdout = '';
var exec = require('child-process-promise').exec;
exec('wmic logicaldisk where drivetype=3 get caption', { capture: ['stdout', 'stderr'] })
.then(function(result) {
var data = result.stdout.split('\r\n');
data = data.splice(1, data.length - 3);
data = data.map(Function.prototype.call, String.prototype.trim);
data.forEach(function(drive) {
// This is where I am getting hung up
});
})
.then(function(result) {
console.log(result);
})
.fail(function(err) {
console.error(err);
});
正如您在上面的代码中所看到的,我将从WMIC的初始执行返回一个驱动器号数组,但在此之后,我将需要根据第一次查询返回的驱动器数再运行WMIC几次。例如,如果我的数据数组看起来是这样的:
['C:','D:']
我需要运行:
wmic logicaldisk where caption="C:" get freespace
wmic logicaldisk where caption="C:" get size
wmic logicaldisk where caption="D:" get freespace
wmic logicaldisk where caption="D:" get freespace
虽然我希望通过一个扁平的承诺链来聚合结果,但我似乎无法思考如何做到这一点。我还看到了一些其他问题,其中建议使用“reduce”,但似乎不知道如何将其应用于我目前的情况。通过迭代数据并将每次调用
exec
的结果存储在数组中,创建一个承诺集合。然后通过将数组传递到Q#all
等待所有承诺的解析
使用嵌套的forEach
:
var promises = [];
data.forEach(function (drive) {
var commands = [
'wmic logicaldisk where caption="' + drive + '" get freespace',
'wmic logicaldisk where caption="' + drive + '" get size'
];
commands.forEach(function (cmd) {
promises.push(exec(cmd, {capture: ['stdout', 'stderr']}));
});
});
return Q.all(promises);
var promises = data.reduce(function (result, drive) {
var commands = [
'wmic logicaldisk where caption="' + drive + '" get freespace',
'wmic logicaldisk where caption="' + drive + '" get size'
].forEach(function (cmd) {
result.push(exec(cmd, {capture: ['stdout', 'stderr']}));
});
return result;
}, []);
return Q.all(promises);
或使用reduce
和map
:
var promises = [];
data.forEach(function (drive) {
var commands = [
'wmic logicaldisk where caption="' + drive + '" get freespace',
'wmic logicaldisk where caption="' + drive + '" get size'
];
commands.forEach(function (cmd) {
promises.push(exec(cmd, {capture: ['stdout', 'stderr']}));
});
});
return Q.all(promises);
var promises = data.reduce(function (result, drive) {
var commands = [
'wmic logicaldisk where caption="' + drive + '" get freespace',
'wmic logicaldisk where caption="' + drive + '" get size'
].forEach(function (cmd) {
result.push(exec(cmd, {capture: ['stdout', 'stderr']}));
});
return result;
}, []);
return Q.all(promises);
在修修补补之后,我已经非常接近一个类似的解决方案了!这是否总是以相同的顺序返回执行的命令?根据Q文档,情况似乎是这样。是的,由于我们正在处理阵列,订单将得到维持。非常好,我感谢您的及时回复和澄清!