【问题标题】:How to implement callback in ngHistory in Pubnub?如何在 Pubnub 的 ngHistory 中实现回调?
【发布时间】:2014-08-11 10:57:51
【问题描述】:

当试图在 on 事件中检索历史消息时,加载时间过长。 微调器显示和隐藏得太快。但消息尚未加载。

我们如何计算或获取加载历史记录的确切时间?

 $scope.limit = 100
 PubNub.ngHistory( {
                        channel : $scope.channel,
                        limit   : $scope.limit
                        });

   $rootScope.$on(PubNub.ngMsgEv($scope.channel), function(ngEvent, payload) {

                **ActivityIndicator.showSpinner();**

                    $scope.$apply(function(){
                    $scope.messages.push(payload.message);
                });

                $(".messages-wrap").scrollTop($(".messages-wrap")[0].scrollHeight);
                **ActivityIndicator.hideSpinner();**

            }); 

【问题讨论】:

  • 应该很快!
  • c.ngHistory = function(args) { args.callback = c._ngFireMessages(args.channel);返回 c.jsapi.history(args); };
  • 库中的回调函数覆盖了ngHistory自定义回调

标签: angularjs pubnub


【解决方案1】:

非常感谢您试用 PubNub AngularJS API!我会尽力 提供一些帮助。有一点点区别 在这种情况下,PubNub JS API 和 PubNub AngularJS API。

背景

在幕后,PubNub JS API history() 方法立即返回, 并在检索到给定的历史“页面”时调用回调。

为了简化这种交互,AngularJS API 没有 进行回调 - 相反,它为每条消息调用 $rootScope.$broadcast() 在返回的历史负载中。

在这个版本的 AngularJS API 中,目前无法“进入” 'ngHistory' 方法提供回调。但是,有2个解决方案 可供您使用:一个一直在那里,第二个我刚刚添加 根据您的反馈。

解决方案

1) 在此处查看 codepen (http://codepen.io/sunnygleason/pen/afqmh)。 PubNub AngularJS API 中有一个“逃生舱”,可让您直接调用 JS API 以用于高级用例,称为jsapi。您可以拨打PubNub.jsapi.history({channel:theChannel,limit:theLimit,callback:theCallback})。唯一要记住的是,这不会将消息事件触发到 $rootScope,您需要调用 $rootScope.$apply()$scope.$apply() 以确保您在回调函数中对 $scope 所做的任何更改都被传播正确的视图。

2) 在此处查看 codepen (http://codepen.io/sunnygleason/pen/JIsek)。如果您更喜欢基于 Promise 的方法,我刚刚在 PubNub AngularJS API 的 1.2.0-beta.4 版本中添加了一个 ngHistoryQ() 函数。这将让您编写如下代码:

PubNub.ngHistoryQ({channel:theChannel,limit:theLimit}).then(function(payload) {
  payload[0].forEach(function(message) {
    $scope.messages.push(message);
  }
});

您可以使用“bower install pubnub-angular”安装最新版本的 AngularJS SDK。

使用这些解决方案中的任何一个,您都应该能够显示和隐藏您的微调器 因此。唯一的区别在于 #2,您需要编写如下代码:

var historyPromise = PubNub.ngHistoryQ({channel:theChannel,limit:theLimit});
showSpinner();
historyPromise.then(function(payload) {
  // process messages from payload[0] array
  hideSpinner();
});

这有帮助吗?让我知道你的想法。再次非常感谢您尝试这个。

【讨论】:

  • 感谢您的详细回复。作为快速修复,扩展 ngHistory 函数并通过注释掉构建回调 ourproject.factory('PubNubService', function(PubNub) { var pubnub = PubNub; pubnub.ngHistory = function(args) { // args 来使用自定义回调.callback = c._ngFireMessages(args.channel); return pubnub.jsapi.history(args); }; return pubnub; });
  • 好的,很高兴这有效!希望上面列出的 2 种机制提供一个更完整的解决方案,不涉及私下更改库!
  • 非常感谢您整理出来。我会接受答案
【解决方案2】:

您可以在历史调用时以编程方式打开微调器,并在回调时以编程方式禁用它吗?

【讨论】:

  • ngHistory 覆盖回调方法以将所有历史记录默认路由到事件。如果没有历史消息,该事件将不会触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2016-04-10
  • 2018-01-06
相关资源
最近更新 更多