2015-08-08 55 views
3

我使用pdf.js来显示pdf文件,但结果不好,请看看我的代码。使用pdf.js时防止simultanous函数调用?

My codes are as follows. 

var aaa = function (pdf, page_number) { 
     pdf.getPage(page_number).then(function(page) { 
     var scale = 1.5; 
     var viewport = page.getViewport(scale); 
     var canvas = $('.pdf-view')[page_number-1]; 
     var context = canvas.getContext('2d'); 
     canvas.height = viewport.height; 
     canvas.width = viewport.width; 
     var renderContext = { 
      canvasContext: context, 
      viewport: viewport 
     }; 
     page.render(renderContext); 
    }); 
}; 
for (var i = 1;i < 51;i++) { 
    aaa(pdf, i); 
    if (i !== 50) { 
     var a = '<canvas data="{{ raw_path }}" class="pdf-view hide" style="margin-bottom:10px;"></canvas>'; 
     $('#file-view #pdf').append(a); 
    } 
} 

有一个循环,那么50个函数(aaa)同时执行。效果是灾难性的,我的电脑卡住了。我想在执行最后一个函数后执行一个函数。

请帮我改进一下。非常感谢。 (对不起,我的英语是灾难性的为好。)

+2

你能告诉我们在aaa()函数内会发生什么。它是一个ajax函数吗? – XPD

+0

嗨,我添加了我的代码,它是关于画布,而不是ajax。请看看 – Patrickgao91

+2

pdf js使用承诺和延期对象来启用异步处理。使用then()附加函数来启用链接。在当前情况下,aaa()在一个循环中被调用,它将同时调用aaa()50次。 – XPD

回答

0

为了避免单一页面加载的同时运行,并呈现功能aaa,你应该将其调用回调页面加载的 - .then(一部分,所以它的递归调用。然后用page_number = 1拨打aaa函数一次。

//define page render function  
var aaa = function (pdf, page_number) { 
      pdf.getPage(page_number).then(function(page) { 
      var scale = 1.5; 
      var viewport = page.getViewport(scale); 
      var canvas = $('.pdf-view')[page_number-1]; 
      var context = canvas.getContext('2d'); 
      canvas.height = viewport.height; 
      canvas.width = viewport.width; 
      var renderContext = { 
       canvasContext: context, 
       viewport: viewport 
      }; 
      page.render(renderContext); 

      if (i < 50) { 
      //render first 50 pages but not all pages except #50 
       aaa(pdf, i); 
       i++; 
      } 

     }); 
    }; 

//pre-generate 50 canvases 
var docFragment = document.createDocumentFragment(); 
for (var i = 1;i < 51;i++) { 
    var c = document.createElement("canvas"); 
    $(c).data({{ raw_path }}); 
    $(c).addClass('pdf-view hide'); 
    $(c).css('margin-bottom', '10px'); 
    docfrag.appendChild(c); 
} 
$('#file-view #pdf').append(docfrag); 

    //call render 
    var i = 1; 
    aaa(pdf, i); 
+0

帮助,非常感谢!这真是太好了 – Patrickgao91

+0

非常适合你!如果这是一个解决方案 - 您可以将此答案标记为正确 – shershen