2016-08-01 68 views
1

我最近开始使用ajax请求。我的请求正在工作,但需要几秒钟才能加载。AJAX请求很慢,在其他页面上找不到解决方案

代码 -

var x = 0; 
function makeTR(){ 
    var appendObject = "<tr>"; 
    for(var i = 0; i < 3; i++){ 
     $.ajax({ 
      async: false, 
      type: 'GET', 
      url: domain + Players[x] + domain2, 
      success: function(data) { 
       appendObject = appendObject + "<td>" + makeTD(data.player, data.rank, data.guild_rank, data.fame, data.last_seen) + "</td>"; 
       x++; 
      } 
     }); 
    } 
    appendObject = appendObject + "</tr>"; 
    return appendObject; 
} 

如果你需要再代码我给你,这是哪里有什么真正的代码虽然只是一部分。

对不起,如果有另一篇文章,我看了一会儿。

在此先感谢!

+2

'async:false'是原因。有更好的选择。从不建议'async:false'。 – Xufox

+0

无论何时它关闭,它从不加载acctual数据,我试图寻找更好的方式来等待它加载,但大多数只是做 '.done(function(){。' 而且那不是很工作以及 – Wverhe2

+0

“它从不加载数据” - 它只是不同步 - 使用上面的异步代码时需要小心,因为这三个请求可能不一定按预期的顺序完成 - 学习和拥抱异步代码 –

回答

-2
$.ajax({ 
     type: 'GET', 
     cache : false, 
     url: domain + Players[x] + domain2, 
     success: function(data) { 
      appendObject = appendObject + "<td>" + makeTD(data.player, data.rank, data.guild_rank, data.fame, data.last_seen) + "</td>"; 
      x++; 
     } 
    }); 
+0

x ++值将在成功后递增,并且需要2或3秒,因此在调用ajax异步时x值始终为1。 –

2

正如评论指出的那样,你的代码是缓慢的,因为它执行Ajax请求一个接一个,如果每个请求需要一秒钟,你的函数有三个。您需要接受异步代码,并使用承诺和/或回调来使其并行工作。以下是使用promise的示例。现在

// this function returns a 'promise' 
function makeTr() { 
    var requests = [] 

    // Don't use async: false, but collect the return values of $.ajax. 
    // Those are promises, which you can use in other calls. 
    for (var x=0; x<3; x++) requests.push($.ajax(domain + Players[x] + domain2)) 

    // Wait until all promises are resolved, then perform the 
    // rendering function. The first return below returns a 'promise' 
    // of your 'appendObject' 
    return Promise.all(requests).then(function(allData) { 
     // allData is an array containing the results of your $.ajax 
     // calls now. 
     var appendObject = "" 
     for (var x=0; x < 3; x++) { 
     var data = allData[x] 
     appendObject += "<tr>" 
     .... 
     appendObject += "</tr>" 
     } 
     return appendObject 
    }) 
}) 

,你可以调用函数一样,

makeTr().then(function(rows) { 
    $(...).append(rows) 
}) 

但你最好的承诺和回调和一般的异步JavaScript读了。因为这是JavaScript的最好的部分。

+0

这不会并行运行。 [Js不是多线程的。异步调用被缓存,但仍然在单个线程上运行](http://stackoverflow.com/a/8963287/542251)。取决于实际发生的事情,这可能会或可能不会“加快速度” – Liam

+0

你是正确的Liam,谢谢你指出我糟糕的词语选择。但是,尽管JS(在页面上)不是多线程的,但浏览器可能是并且低级http请求可能会被并行化。 – lordvlad

相关问题