如何构造代码以返回回调

How to structure my code to return a callback?

本文关键字:返回 回调 代码 何构造      更新时间:2023-09-26

所以我已经在这个问题上呆了很长一段时间了。我在这里问了一个类似的问题:done()到底是如何工作的,我如何在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()只执行一次

问题是UI操作和JS操作都在同一个线程中运行。因此,要解决这个问题,您应该只使用setTimeout函数,以便JS操作在所有UI操作结束时排队。您还可以为时间间隔(大约4ms)传递一个参数,这样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工作者就是进行数据密集型操作的方法。