2013-08-16 19 views
1

所以我一直坚持这一段时间。我在这里问了一个类似的问题:How exactly does done() work and how can I loop executions inside done()? 但我想我的问题已经改变了一下。如何构建我的代码以返回回调?

因此,事情是,我正在加载大量的流,它需要一段时间来处理它们。为了弥补这一点,我想至少将已经处理的流加载到我的网页上,并同时继续处理推文流。

loadTweets: function(username) { 
    $.ajax({ 
      url: '/api/1.0/tweetsForUsername.php?username=' + username 
     }).done(function (data) { 

      var json = jQuery.parseJSON(data); 
      var jsonTweets = json['tweets']; 

      $.Mustache.load('/mustaches.php', function() { 
       for (var i = 0; i < jsonTweets.length; i++) { 
        var tweet = jsonTweets[i]; 
        var optional_id = '_user_tweets'; 
        $('#all-user-tweets').mustache('tweets_tweet', { tweet: tweet, optional_id: optional_id }); 

        configureTweetSentiment(tweet); 
        configureTweetView(tweet); 
       } 
      }); 
     }); 
    }}; 
} 

这几乎是我现在的代码结构。我想问题是for循环,因为在for循环完成之前什么都不会显示。所以我有两个问题。

  1. 如何获取推文流以显示在我的网站上,因为他们正在处理?
  2. 如何确保Mustache.load()仅在执行此操作时执行一次?
+0

UI块是它吗? – Tushar

+0

什么?我不明白你刚刚说了什么。 – dtgee

+0

您是否多次调用loadtweets方法?当你说流是否意味着推文或用户流? – Tushar

回答

0

问题是UI操作和JS操作都在同一个线程中运行。所以为了解决这个问题,你应该使用setTimeout函数,以便JS操作在所有UI操作结束时排队。您还可以传递时间间隔参数(大约4毫秒),以便带有较慢JS引擎的浏览器也可以顺利执行。

 ... 

var i = 0; 
var timer = setInterval(function() { 

    var tweet = jsonTweets[i++]; 
    var optional_id = '_user_tweets'; 
    $('#all-user-tweets').mustache('tweets_tweet', { 
     tweet: tweet, 
     optional_id: optional_id 
    }); 
    configureTweetSentiment(tweet); 
    configureTweetView(tweet); 

    if(i === jsonTweets.length){ 
     clearInterval(timer); 
    } 
}, 4); //Interval between loading tweets 
     ... 

注意
该解决方案基于以下假设 -

  1. 您与configureTweetSentimentconfigureTweetView方法操纵DOM。

    理想情况下,上面提供的解决方案不是最好的解决方案。相反,您应该只在JavaScript中创建所有html元素,并在最后将最终的html字符串附加到div。您会看到性能发生剧烈变化(严重!)

  2. 您不想使用网络工作者,因为它们在旧版浏览器中不受支持。如果情况并非如此,并且您没有用configure方法操纵dom,那么Web工作人员就是数据密集型操作的途径。

+0

所以我想我已经尝试过这个解决方案,但是同样的推文正在加载 – dtgee

+0

这是因为你的代码有错误。 '''var tweet = jsonTweets [i];'''应该进入循环。 – Tushar

+0

好吧对不起,我其实已经改变了。嗯,但实际上问题是推文仍然没有一次发布。代码似乎没有做任何事情,除非我把它加错了 – dtgee