等待for循环的承诺

进入这整个异步的东西我有点麻烦。 我正在使用pdf.js来读取pdf文件的内容。 一切正常,但执行顺序给我带来了麻烦。 这是我的代码:

function getText(data) { var contents = []; PDFJS.getDocument(data).then(function(pdf) { var numPages = pdf.pdfInfo.numPages; for (var i = 1; i <= numPages; i++) { pdf.getPage(i).then(function(page) { page.getTextContent().then(function(content) { contents.concat(content.bidiTexts); }) }); } }) } 

这是按预期工作的,但是,我想在处理所有页面并将其bidiTexts连接到内容时传递内容。 如果我只是在最后一次关闭之前将contents作为参数进行函数调用,那么它会被提前调用。

尝试使用promises:

 function getText(data) { var contents = []; var promises = []; PDFJS.getDocument(data).then(function(pdf) { var numPages = pdf.pdfInfo.numPages; for (var i = 1; i <= numPages; i++) { var deferred = $.Deferred(); //Create a deferred object promises.push(deferred.promise()); //push promise to the list pdf.getPage(i).then(function(page) { page.getTextContent().then(function(content) { contents.concat(content.bidiTexts); deferred.resolve(); //resolve the deferred object }) }); } $.when.apply($,promises).then(function(){ //callback executed when all deferreds are resolved //do your task with contents }); }) } 

这只是一个如何使用promises的演示。 在实际应用程序中,您必须使用deferred.reject处理错误,并在第二次回调中处理它$.when