2016-06-06 85 views
0

對於學校歷史項目,我正在製作一個時間軸網頁(live here)。爲了避免必須重複輸入每個細節的細節,我將它們放在電子表格中,並將其導出爲JSON如何強制getJSON的同步執行?

淨資產值,我創建標記使用JavaScript事件發生的年份鏈接。

我想,然後使用slick.js,一個jQuery插件,打開導航到一個旋轉木馬,這表現直播網站上面鏈接的的/slick-test-static.html。

我的代碼:

$(document).ready(function(){ 
     $.getJSON("data.js", function(result){ 
     for (var i = 0; i < result.length; i++){ 
      var string = JSON.stringify(result[i]); 
      var parsed = JSON.parse(string); 

      $('.slider').append("<li><a href=\"#" + parsed.number + "\">" + parsed.year + "</a></li>"); 
     } 
     }); 

     $('.slider').slick({ 
     slidesToShow: 8, 
     slidesToScroll: 5, 
     autoplay: true, 
     autoplaySpeed: 3000 
     }); 
    }); 

該鏈接的創建,但滑塊不可。我做了一個頁面,其中創建的鏈接而不是使用JSON,它工作正常。

我認爲這個問題是因爲該方法的getJSON是異步的,所以瀏覽器嘗試創建滑塊之前的項目甚至添加到滑塊。首先,這個問題?如果是這樣,解決它的最好方法是什麼?

+1

你可以用」這樣做。你應該使用承諾。 – SLaks

+0

嘗試在下載JSON後異步調用浮動,而不是嘗試阻止用戶界面。簡單地把它的調用放在回調中,在那個循環之後。 – Bergi

+0

@Bergi工作,謝謝!出於某種原因,我忽略了我可以這樣做的事實。 –

回答

1

你不能讓這個同步。使用ES6,您可以使用asyncawait「虛假」等待異步操作,但它所做的基本上與完成此項工作所需的操作相同。

你需要堅持的$.getJSON回調裏面你$('.slider').slick(...代碼。在進行異步回調之前,您不應該初始化滑塊。

0

不知道這是否有助於你的具體問題,但你的確可以使同步JSON請求。

異步請求將(香草JS):

var request = new XMLHttpRequest(); 
request.open("GET", "/bar/foo.txt", true); // Note the `true` here. 
request.send(null);      // When set to true, the request 
             // will be asynchronous. 
if (request.status === 200) { 
    console.log("ok"); 
} 

雖然同步請求將是:

var request = new XMLHttpRequest(); 
request.open('GET', '/bar/foo.txt', false); // `false` makes the request synchronous 
request.send(null); 

if (request.status === 200) { 
    console.log("ok"); 
} 

您這裏有一些文檔: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests