2017-04-25 58 views
2

我有一个jQuery $ .ajax()函数返回一个base64值,这是成功的pdf页面。我必须返回多个base64值,所以我能想到如何做到这一点的唯一方法是循环访问$ .ajax()函数。当每次成功返回时,我都会将base64值写入图像元素。这工作正常。问题是,因为它是异步的,它不一定会按顺序返回页面。 我知道这不是最好的方法,但是如果我总是会有不同的值,那么这是页数呢?

for (i = 1; i <= pdfPageCount; i++) { 
      $.ajax({ 
       type: 'POST', 
       contentType: 'application/json', 
       url: 'Page.aspx/Method', 
       dataType: 'json', 
       error: function (err) { 
        alert('Error: ' + err); 
       }, 

       success: function (resultStr) { 
        //alert('Page: ' + i); 

        var sigImage = document.createElement("img"); 
        sigImage.setAttribute('src', 'data:image/png;base64,' + 
    resultStr.d); 

        document.getElementById("imgId").appendChild(sigImage); 
       }, 
      }); 
    } // end the for loop 

的HTML只是有一个div:

<form id="form1" runat="server"> 
    <div id="imgId"> 
    </div> 
    </form> 
+0

根据定义,阿贾克斯是异步的。你可能有两个解决方案:回调地狱或承诺... – Badacadabra

回答

1

他们的关键是使用when。虽然您可以以同步的方式链接您的电话,但我不会建议。更好的方法是异步调用每个页面,然后同时等待所有结果。

var pages = []; 
var deferredObjs = []; 
for (i = 0; i <= pdfPageCount; i++) { 
      deferredObjs[i] = $.ajax({ 
       type: 'POST', 
       contentType: 'application/json', 
       url: 'Page.aspx/Method', 
       dataType: 'json', 
       error: function (err) { 
       alert('Error: ' + err); 
      }, 

      success: function (resultStr) { 
      pages[i] = resultStr; 
      }, 
     }); 
} // end the for loop 


$.when.apply($, deferredObjs).then(aFunctionToProcessPageResults()); 

另外,您的POST不应该提供页码返回吗?请注意,我更改了索引变量以开始0.您可能需要对此进行解释。

+0

我结束了使用非常相似的东西。谢谢你的帮助。 – wrikgee

0

您需要通过从成功回调Ajax调用递归,而不是使用迭代。

(function recurse(i){ 
     if(i > pdfPageCount)return; 
     $.ajax({ 
      type: 'POST', 
      contentType: 'application/json', 
      url: 'Page.aspx/Method', 
      dataType: 'json', 
      error: function (err) { 
       alert('Error: ' + err); 
      }, 
      success: function (resultStr) { 
       recurse(i+1); 

       var sigImage = document.createElement("img"); 
       sigImage.setAttribute('src', 'data:image/png;base64,' + 
resultStr.d); 

       document.getElementById("imgId").appendChild(sigImage); 
      } 
     }); 
    })(1) 
1
$.ajax({ 
       url:"url", 
       data:form, 
       dataType:'json', 
       async:true, 
       type:'post', 
       processData: false, 
       contentType: false, 
       success:function(data){} 
       }); 

异步:真

+0

这确实回答了这个问题,但出于性能原因,一次向服务器发出一个请求并不可取。 – ChiralMichael