gpt4 book ai didi

javascript - 我对长轮询的实现是否正确?

转载 作者:行者123 更新时间:2023-11-28 02:32:47 30 4
gpt4 key购买 nike

我正在尝试为我们基于网络的系统实现一个简单的通知系统。我读过 websocket、ratchet、socket.io 等。但这里的问题是,我真的没有足够的时间来实现这些,所以我决定用长轮询来解决。但是,我不太确定我是否真的做对了,或者一旦我们上传了我们的系统,我就会向我的服务器发送垃圾邮件。我还阅读了几个关于长轮询的主题,但我不太确定这些与我目前使用的有何不同。所以我担心的是:

1.谁能告诉我我做的长轮询是否正确?
<强>2。如果不是,我应该如何更改我的代码?

HTML:

<li class="dropdown notifications-menu" id="notif-div">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-bell-o"></i><?php if (!empty($notif_count)): ?><span class="label label-warning" id="notif-count"><?php echo $notif_count->notif_count?></span>
<?php endif; ?>
</a>
<ul class="dropdown-menu">
<li>
<ul class="menu">
<?php foreach ($notifications as $key => $notification): ?>
<?php if ($notification->type_of_notification == 'Comment'): ?>
<li>
<a href="<?php echo $notification->href ?>">
<i class="ion-chatbubble"></i> <?php echo $notification->title_content ?>
</a>
</li>
<?php elseif ($notification->type_of_notification == 'Reply'):?>
<li>
<a href="<?php echo $notification->href ?>">
<i class="ion-chatbubbles"></i> <?php echo $notification->title_content ?>
</a>
</li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
</li>
</ul>
</li>

JS:

(function() {
var notif = function(){
var user_id = {
user_id: "<?php echo $traveller_details->user_id ?>"
};
$.ajax({
url: "/Home/get_notif",
type: "POST",
data: user_id,
success: function (data){
$('#notif-div').html(data);
}
});
};
setInterval(function(){
notif();
}, 60000);
})();

PHP:

public function get_notif()
{
$this->data['notif__count'] = $this->Homes->get_notif_count($this->input->post('user_id'));
$this->data['notifications'] = $this->Homes->get_notifications($this->input->post('user_id'));
echo '
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-bell-o"></i>';
if (!empty($this->data['notif__count'])) {
echo '<span class="label label-warning" id="notif-count">'.$this->data['notif__count']->notif_count.'</span>';
}
echo '</a>';
echo '<ul class="dropdown-menu">
<li>
<ul class="menu">';
foreach ($this->data['notifications'] as $key => $notification) {
if ($notification->type_of_notification == 'Comment') {
echo '
<li>
<a href="'.$notification->href.'">
<i class="ion-chatbubble"></i> '.$notification->title_content.'
</a>
</li>
';
}elseif ($notification->type_of_notification == 'Reply') {
echo '
<li>
<a href="'.$notification->href.'">
<i class="ion-chatbubbles"></i> '.$notification->title_content.'
</a>
</li>
';
}
}
echo '
</ul>
</li>
</ul>
';
}

我对长轮询不是很熟悉,所以我道歉。顺便说一句,我正在使用 Codeigniter 框架。提前致谢。

最佳答案

嗯,您的代码看起来是正确的,但如果您真的想使用这种方法,您仍然可以改进您的代码。

所以第一次加载页面时,您将收到该用户的所有新通知。现在将通知的最后一个 ID 存储在 session 中。例如,如果最后插入的通知 ID 为 200,只需在 session 中添加商店 200。

当你对你的 php 函数进行 ajax 调用时,从 session 中获取存储的通知 ID,并在你的 when 条件中添加一个条件

->where("notification_id",">",$YOUR_ID);

因此,根据我的示例,您将获得在 ID 200 之后添加的所有通知。现在,在发送此结果之前,使用最新的通知 ID 更新 session 值。

在您的 AJAX 函数中,您无需替换整个 HTML,只需将新数据附加到现有数据即可。因此,与其从数据库中获取所有行并替换 HTML,不如仅获取新添加的数据并附加。

关于javascript - 我对长轮询的实现是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49574675/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com