NodeJS / jQuery - 轮询通知API

时间:2017-03-20 15:02:16

标签: javascript jquery node.js

我在API中有以下JSON数据:

[
   {
      notification: "'James' has created a new user. This requires
      approval",
      read: null
   }
]

我有以下jQuery:

$.ajax({
    dataType: "json",
    url: "/api/notifications",

    success: function(data) {
    counterText = 0;
    $.each(data, function(index, value) {

      if(value.read == 0 || value.read == null)
      {
          var theCounter = parseInt($('.counter').text());
          counterText += theCounter += 1;
      }
   });
   $('.counter').text(counterText);
   }
});

问题是这只有在有人刷新浏览器时才有效。我正在使用Socket.io来进行实时通知,但是,每次进入套接字时,我理想情况下都需要更新此代码。例如,一个名为" Ping&的事件#34;

socket.on("test-channel:App\\Events\\Ping", function(message) {
  $.toast({
    heading: 'Information',
    text: message.data.message,
    icon: 'info',
    loader: false,        // Change it to false to disable loader
    loaderBg: '#9EC600'  // To change the background
 });
});

然而,有很多事件,所以我真的不想每次都要更新。理想情况下,我希望对此文件进行即时轮询,以便通知可以立即更新,而无需刷新浏览器。

1 个答案:

答案 0 :(得分:1)

换句话说,听起来你想为你的AJAX方法添加一个轮询机制。 (套接字可以具有诸如延迟减少等优点,但它们可能稍微复杂一些,所以我理解为什么你现在可能不想尝试它们。)你当前所有的AJAX代码都缺乏实际上只是一个连续请求的机制。间隔。你可以用:

来做到这一点
var polling = true;
var period = 60 * 1000; // every 60 seconds
var interval = polling && setInterval(function() {
  if (polling) {
    $.ajax({
      ... // existing ajax call here
    });
  } else {
    if (interval) {
      clearInterval(interval);
    }
  }
}, period);

// Later, if you want to stop polling, you can:
polling = false;

// ...or even just:
if (interval) {
  clearInterval(interval);
}