Javascript 迭代数组并等待承诺

Javascript 迭代数组并等待承诺,javascript,node.js,promise,Javascript,Node.js,Promise,如何使用承诺和返回的数据遍历数据数组?我见过一些Promissions.push(asyncFunc)方法,但是我数组中的一些条目将失败,所以从我收集的信息来看,我不能使用它 var filesFromDisk = [ '41679_4_2015-09-06_17-02-12.mp4', '41679_4_2015-09-06_17-02-12.smil', '41680_4_2015-09-09_10-44-05.mp4' ]; start(filesFromDisk

如何使用承诺和返回的数据遍历数据数组?我见过一些Promissions.push(asyncFunc)方法,但是我数组中的一些条目将失败,所以从我收集的信息来看,我不能使用它

var filesFromDisk = [
    '41679_4_2015-09-06_17-02-12.mp4',
    '41679_4_2015-09-06_17-02-12.smil',
    '41680_4_2015-09-09_10-44-05.mp4'
];

start(filesFromDisk)
    .then((data) => {
        console.log(data); // Want my data here
});
我从另一个文件开始
start(dbFiles)
,这就是为什么我希望返回那里的数据

function start(dbFiles) {
    var listOfFiles = [],
        promises = [];
    return new Promise((fulfill, reject) => {
        for (var i = 0; i < dbFiles.length; i++) { 
            getMp4(dbFiles[i])
                .then((data) => {
                    listOfFiles = listOfFiles.concat(data);
                    console.log(listOfFiles);
                })
        }
        fulfill(listOfFiles) // Need to happen AFTER for loop has filled listOfFiles
    });
}
getMp4中Promise.all链中的方法-我知道它们没有问题

var privateMethods = {
    getFileName: (str) => {
        var rx = /[a-zA-Z-1\--9-_]*.mp4/g;
        var file = rx.exec(str);   
        return file[0];
    },
    setSmileExt: (videoFile) => {
        return videoFile.split('.').shift() + '.smil';
    },
    fileExists: (file) => {
        return new Promise((fulfill, reject) => {
            try {
                fs.accessSync(file);
                fulfill({exists: true})
            } catch (ex) {
                reject({exists: false})
            }
        })
    },
    readTest: (file) => {
        return new Promise((fulfill, reject) => {
            fs.readFile(file, (err, res) => {
                if (err) reject(err);
                else fulfill(res.toString());
            })
        })
    }
}

如果您需要它们并行运行,
承诺。所有这些都是您想要的:

function start(dbFiles) {
    return Promise.all(dbFiles.map(getMp4));
}
这将启动所有文件的
getMp4
操作,并等待它们全部完成,然后使用结果数组进行解析。(
getMp4
将接收多个参数—值、其索引和对
dbFiles
arary的引用—但由于它只使用第一个参数,这没关系。)

用法:

start(filesFromDisk).then(function(results) {
    // `results` is an array of the results, in order
});

为了完整起见,如果需要按顺序运行,可以使用
reduce
模式:

function start(dbFiles) {
    return dbFiles.reduce(function(p, file) {
        return p.then(function(results) {
            return getMp4(file).then(function(data) {
                results.push(data);
                return results;
            });
        });
    }, Promise.resolve([]));
}

同样的用法。请注意,我们如何从一个用
[]
解析的承诺开始,然后将一组
处理程序排队,每个处理程序接收数组,执行
getMp4
调用,当它得到结果时,将结果推送到数组上并返回它;最终的分辨率值是填充数组。

是否需要它们并行运行或按顺序运行?只要我的起始点中的数据在该数组中完整,它们就可以并行运行。然后()。如果我理解你correctly@Alnitak:OMG,我真的写了
.map(函数(文件){return getMp4(文件);})
!我需要更多的咖啡。非常感谢。(已修复。)不客气:)无关的函数包装总是困扰我…:p@Alnitak:我也是……正常情况下。:-)啊,这更有道理。但是,数组中的一些文件将被捕获,
承诺。all
不返回任何内容。如果我没有完全误解的话。机器人程序代码段不返回任何结果。我很困惑。@ThomasJohansenToft:如果
getMp4
解析了它返回的承诺,那么该解析值将在数组中。很抱歉,我无法帮助您调试
getMp4
中正在发生的事情,但以上绝对是您并行执行一系列操作并使用所有操作的结果获得最终结果的方法。
function start(dbFiles) {
    return dbFiles.reduce(function(p, file) {
        return p.then(function(results) {
            return getMp4(file).then(function(data) {
                results.push(data);
                return results;
            });
        });
    }, Promise.resolve([]));
}