javascript - 如何从 forEach 循环中实现扁平化的 promise 数组?

标签 javascript promise q

我正在尝试利用 promise 链(通过 Q 和节点子进程 promise 库)来使用 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

虽然我想从一个扁平的 promise 链来聚合结果,但我似乎无法全神贯注于如何做到这一点。我已经看到其他几个建议使用“减少”的问题,但似乎无法弄清楚如何将其应用于我目前的情况。

最佳答案

通过遍历数据并将每次调用 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);

或者使用reducemap:

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);

关于javascript - 如何从 forEach 循环中实现扁平化的 promise 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32784822/

相关文章:

javascript - (按钮 || 输入) type=submit - jQuery AJAX 中 $_POST 变量缺少值

javascript - Bluebird 嵌套 promise 与每个/传播

javascript - Bluebird "map"是否提前返回?

javascript - 避免类似协程的 JavaScript 函数中的 "yield"重复

javascript - 如何停止提交并提醒用户用JS选择的问题少于10个问题

jquery - 可能显示 :none this without JavaScript?

jquery - 使用带有 Promise 的 jQuery 加载

javascript - 如何循环promise函数流程控制

javascript - 将参数传递给 angularjs $q 中 promise 的成功回调

Javascript正则表达式将图像文件发送到asp.net中的FileUpload控件