Javascript 当每次迭代调用异步选项时,如何等待forEach完成?

Javascript 当每次迭代调用异步选项时,如何等待forEach完成?,javascript,node.js,meteor,callback,promise,Javascript,Node.js,Meteor,Callback,Promise,好的,计划是这样的。浏览每个文件,将文件添加到数组中。添加所有文件后,使用JSZiputability和Docxtemplater将它们合并: 'click .merge-icon': (e) => { var programId = Router.current().url.split('/').pop(); var programObj = Programs.findOne(programId); var insertedDocuments = [];

好的,计划是这样的。浏览每个文件,将文件添加到数组中。添加所有文件后,使用JSZiputability和Docxtemplater将它们合并:

'click .merge-icon': (e) => {
    var programId = Router.current().url.split('/').pop();
    var programObj = Programs.findOne(programId);
    var insertedDocuments = [];
    var i = 0;
    var count = programObj.activityIds.count;
    var fileDownloadPromise = new Promise((resolve, reject) => {
      programObj.activityIds.forEach(function(activityId) {
        var activityObj = Activities.findOne(activityId);
        var documentObj = ActivityFiles.findOne(activityObj.documents.pop()._id);
        JSZipUtils.getBinaryContent(documentObj.url(), callback);
        function callback(error, content) {
          var zip = new JSZip(content);
          var doc = new Docxtemplater().loadZip(zip);
          var xml = zip.files[doc.fileTypeConfig.textPath].asText();
          xml = xml.substring(xml.indexOf("<w:body>") + 8);
          xml = xml.substring(0, xml.indexOf("</w:body>"));
          xml = xml.substring(0, xml.indexOf("<w:sectPr"));
          insertedDocuments.push(xml);
          i++;
          if (i == count - 1) {
            resolve();
          }
        }
      });
    });
    fileDownloadPromise.then(() => {
      JSZipUtils.getBinaryContent('/assets/template.docx', callback);
      function callback(error, content) {
        console.log(content);
        var zip = new JSZip(content);
        var doc = new Docxtemplater().loadZip(zip);
        setData(doc);
      }

      function setData(doc) {
        doc.setData({
          body: insertedDocuments.join('<w:br/><w:br/>')
        });
        doc.render();
        useResult(doc);
      }

      function useResult(doc) {
        var out = doc.getZip().generate({
          type: 'blob',
          mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
        });
        saveAs(out, programObj.name + '.docx');
      }
    });
  }
“点击合并图标”:(e)=>{
var programId=Router.current().url.split('/').pop();
var programObj=Programs.findOne(programId);
var insertedDocuments=[];
var i=0;
var count=programObj.activityIds.count;
var fileDownloadPromise=新承诺((解决、拒绝)=>{
programObj.activityId.forEach(函数(activityId){
var activityObj=Activities.findOne(activityId);
var documentObj=ActivityFiles.findOne(activityObj.documents.pop()。\u id);
getBinaryContent(documentObj.url(),回调);
函数回调(错误、内容){
var zip=新的JSZip(内容);
var doc=new Docxtemplater().loadZip(zip);
var xml=zip.files[doc.fileTypeConfig.textPath].asText();
xml=xml.substring(xml.indexOf(“”+8);
xml=xml.substring(0,xml.indexOf(“”);

xml=xml.substring(0,xml.indexOf)(“显而易见的问题是,
i==count-1
是否计算为
true
?是否要下载每个文件并使用promise.all()若要等待它们,请执行压缩。@Evantimboli否。条件所包含的回调未被调用。@marekful我根本无法理解承诺。所以承诺基本上是不相关的。请找出调用
getBinaryContent
不会触发回调的原因。url正确吗?是
documentObject.u吗rl()
调用正确的东西吗?根据文档,即使有错误,也应该调用回调。显而易见的问题是,
i==count-1
是否计算为
true
?是否要下载每个文件并使用promise.all()若要等待它们,请执行压缩。@Evantimboli否。条件所包含的回调未被调用。@marekful我根本无法理解承诺。所以承诺基本上是不相关的。请找出调用
getBinaryContent
不会触发回调的原因。url正确吗?是
documentObject.u吗rl()
要调用的是正确的东西吗?根据文档,即使有错误,也应该调用回调。