如何从 forEach 循环中实现扁平化的承诺数组?
How can I achieve a flattened array of promises from a forEach loop?
我正在尝试利用承诺链(通过 Q 和节点子进程承诺库)提取驱动器号、免费 space 和利用 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 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
的结果存储在数组中来创建 Promise 集合。然后通过将数组传递给 Q#all
.
来等待所有 Promise 的解析
使用嵌套 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);
或使用reduce
和map
:
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 和节点子进程承诺库)提取驱动器号、免费 space 和利用 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 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
的结果存储在数组中来创建 Promise 集合。然后通过将数组传递给 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);
或使用reduce
和map
:
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);