【问题标题】:How to check if a JSON object value has changed when new request is captured捕获新请求时如何检查 JSON 对象值是否已更改
【发布时间】:2013-03-05 04:02:44
【问题描述】:

我有一个 php 脚本,它以 JSON 格式获取特定用户的最新推文。 JSON 被解析为一个 AJAX 函数,该函数在页面上的一个 ID 中显示最新的推文。每 x 秒设置一个计时器来执行上述操作,检索最新的推文,而无需用户刷新页面。这完美地工作。

我现在正在尝试创建一个通知功能,当有新推文要显示时显示通知。在检索到的 JSON 中,每条推文都有一个名为“id_string”的唯一 ID。我想要做的是以某种方式存储生成的 id_string 的值,然后每次请求检索新推文时,检查新的 'id_string' 与存储的'id_string',如果不同则显示通知。

关于如何解决这个问题的任何想法都会很棒?!我研究过本地存储,但对此不是很熟悉,据我所知,您无法根据本地存储中的其他字符串检查字符串。

这是帮助解释我的问题的必要代码:

PHP 向 twitter 发出请求并生成 JSON 格式的输出 (tweets.php):

require_once('config/FrameFunctions.php');

$output = array();

foreach ($tweeters as $i => $tweeter){
    $theTweeter = new Tweeter($tweeter, $tmhOAuth);
    $allinfo = $theTweeter->getTweets();
    $output[$i] = $allinfo;
}

header("Content-type: application/json");
echo json_encode($output);

每隔 x 秒发出一次请求并生成客户端输出的 javascript:

$(document).ready(function() {

   $('.fancybox').fancybox();
   /*
   *  call ajax function and update latest
   */        

    var refreshTweets = function() {
      console.log("updating..");
      $.ajax({url:"tweets.php",success:function(result){
        tweets = eval(result);

        for(i=0;i<tweets.length;i++){
            $("#latesttweet"+(i+1)).html(
               tweets[i][0].user.name + ": " + tweets[i][0].text
             );  
        }

      }});

    }
    refreshTweets();

    //set the time in milliseconds here for each refresh
    setInterval(refreshTweets , 30000); //Interval

});

【问题讨论】:

  • 为什么需要本地存储来做到这一点?您可以将最新的 tweet_id 存储在 javascript 变量中,并每次都将其与新变量进行检查。您还可以使用 javascript 数组来记录所有推文 ID 并将新的 ID 与它进行比较。
  • 据我所知,您无法根据本地存储中的其他字符串检查字符串” - 为什么不呢?它会运作良好。你试过了吗?
  • @JaspalSingh:例如,让脚本在手动刷新页面时仍然有效 - 这将是一个不错的功能
  • @tom: 不要使用eval!!!如果您需要,请使用JSON.parse,但实际上 jQuery 已经为您做到了。只需设置tweets = result
  • @Bergi 如果页面刷新,您可以从服务器端再次创建整个数据。如果他的网站在没有客户端资源的情况下也能正常运行,那么他的网站将不必要地使用客户端资源。

标签: php javascript json jquery local-storage


【解决方案1】:

这是基于我上面的 cmets 的解决方案

/*
NOTE : allTweets will have to be populated with all the tweets ids on the page prior           
to being called in refreshTweets so that it does not trigger fake notifications
*/

    var allTweets = Array();

    $(document).ready(function() {

        $('.fancybox').fancybox();
        /*
         *  call ajax function and update latest
         */        

        var refreshTweets = function() {
            console.log("updating..");
            $.ajax({url:"tweets.php",success:function(result){
                    tweets = result;

                    for(i=0;i<tweets.length;i++) {

                        //check if its a new tweet or not
                        if (allTweets[tweets[i][0].id_string] === undefined) {
                            allTweets[tweets[i][0].id_string] = 1;    
                            //trigger notification here!
                        }

                        $("#latesttweet"+(i+1)).html(
                        tweets[i][0].user.name + ": " + tweets[i][0].text

                    );  
                    }

                }});

        }
        refreshTweets();

        //set the time in milliseconds here for each refresh
        setInterval(refreshTweets , 30000); //Interval

    });

【讨论】:

  • 谢谢你!我现在试一试,然后回复你。至于上面的注释,我不确定我将如何实现这一点。 - 我的问题中的 php 是检索 JSON 的位置,其中包括所有推文、tweet_ids 等。只有在“refreshTweets”函数输出 JSON 中的对象值之前。那么我将如何去做你上面提到的笔记呢? 'tweets = result' 和 for 循环是每个 twitter 用户的值被提取的地方,所以这不需要在脚本的早期包含吗?
  • allTweets 也不需要计时器来刷新数组中的 tweet_id。否则它只会在用户第一次加载页面时获得 tweet_id。例如说自从第一个页面加载以来已经有 5 条新推文,这个脚本将适用于第一条新推文,但是之后的任何推文脚本仍然会将最新的 tweet_id 与第一条推文进行比较,而不是前一条推文的 tweet_id .你明白我的意思吗?
  • @Tom:不,allTweets 存储所有显示过的推文的 ID,而不仅仅是最新的推文。
  • @Bergi 那将如何工作?因为肯定它总是匹配的,因为在刷新之前 id 将被放入数组中。你能给我一个简单的例子,让我更清楚地理解你的答案吗?
【解决方案2】:

我想和其他人一起评论,但我想我太新了。

无论如何,如果您不存储敏感信息,您可以将数据存储在 JSON 中,PHP 可以快速写入和读取较小的文件。如果您要存储大量数据,则可能需要考虑将值保存到 MySQL 数据库或类似的东西。

这里似乎对设置 JSON 存储和 MySQL 数据库都有很好的记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2017-11-25
    • 2011-05-16
    • 2020-11-18
    • 2014-11-28
    相关资源
    最近更新 更多