2016-06-06 90 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