从服务器提取消息并在客户端

时间:2017-05-27 11:57:31

标签: javascript php

$scope.receivefb = function receivefb(){
    var url ="js/db.php";
    $http.post(url).success(
      function(data){
        console.log(data);
        if(data.msg!=""){
  document.getElementById('messages').innerHTML += '<div class="row message-body"><div class="col-sm-12 message-main-receiver"><div class="receiver"><div class="message-text" name="messaggio" id='+data.id+'>'+data.msg+'</div><span class="message-time pull-right">Sun</span></div></div></div>';

            }
            $timeout($scope.receivefb, 2000);

      })


}

我正在使用这个javascript函数每2秒调用一个php脚本,它从db获取最后一条消息,然后我打印它。我没有使用这个超时的东西,相反,我想使用一种始终监听的脚本,并在每次检测到新消息时触发我的javascript。 这个概念非常简单,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

实际上,如果您没有向服务器发出请求,或者服务器通过某些Web套接字或“web-socket式”技术通知客户端,则无法检测是否有新消息。

至少有两种解决方案:

1)使用socket.io开发服务器端web-socket app,绑定到某个消息事件并将新消息放入$scope.messages数组,将呈现逻辑委托给angular。优点是它基于事件工作并具有“实时性”,缺点是你要学习nodejs并拥有nodejs服务器(简单廉价的灯服务器托管可能没有nodejs支持)。

2)或者只是简单地每2秒轮询一次与渲染逻辑分开的消息,并将新消息发送到$scope.messages,将渲染逻辑委托给angular(观察ng-repeat tutorials):

JS部分(MessagesController内部):

$scope.messages = [];
function receivefb(scope) {
  var url ="js/db.php";
  $http
    .post(url)
    .success(function(data) {
      if(response.msg != '') {
        scope.messages.push(data);
      }
    })
    .finally(function() {
      (function(method, scope) {
        setTimeout(function(){
          method(scope);
        }, 2000)
      )(receivefb, scope);
    });
}
receivefb($scope);

HTML部分:

<div ng-controller="MessagesController">

  <div ng-repeat="message in messages" class="row message-body">
    <div class="col-sm-12 message-main-receiver">
      <div class="receiver">
        <div class="message-text" name="messaggio" id="{{message.id}}">
          {{message.msg}}
        </div>
        <span class="message-time pull-right">Sun</span>
      </div>
    </div>
  </div>

</div>