Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 如何从forEach循环中实现一个平坦的承诺数组?_Javascript_Promise_Q - Fatal编程技术网

Javascript 如何从forEach循环中实现一个平坦的承诺数组?

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)

我正试图利用一系列承诺(通过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 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文档,情况似乎是这样。是的,由于我们正在处理阵列,订单将得到维持。非常好,我感谢您的及时回复和澄清!