Javascript 当每次迭代调用异步选项时,如何等待forEach完成?
好的,计划是这样的。浏览每个文件,将文件添加到数组中。添加所有文件后,使用JSZiputability和Docxtemplater将它们合并: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 = [];
'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()
要调用的是正确的东西吗?根据文档,即使有错误,也应该调用回调。