1

我使用 Twitter 的 Angular 应用程序的页面上嵌入了一些推文widgets.js。他们已经工作了很长一段时间。我今天注意到他们突然停止工作。我一直在尝试调试该问题,但无论我尝试什么,我似乎都无法加载推文。控制台中没有错误。如果我从控制台手动初始化推文,代码似乎可以正常执行。我可以通过在一个函数中将一些内容记录到控制台来验证这一点,该then函数只应在twttr.widgets.createTweet()解决返回的承诺时调用。

在我的application.html.erb我有以下内容:

<!-- Twitter oEmbed Widget -->
<script>
    window.twttr = (function(d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0],
        t = window.twttr || {};
        if (d.getElementById(id)) return t;
        js = d.createElement(s);
        js.id = id;
        js.src = "https://platform.twitter.com/widgets.js";
        fjs.parentNode.insertBefore(js, fjs);

        t._e = [];
        t.ready = function(f) {
            t._e.push(f);
        };

        return t;
    }(document, "script", "twitter-wjs"));
</script>

在我的指令模板中,我指定了一个带有 Tweet id 的 div,如下所示:

<div class="fade" ng-show="!loading" ng-if="post.provider === 'twitter'" id="{{'post_' + post.id}}"></div>

然后在我的指令的控制器中,我在延迟后初始化小部件以确保 DOM 已准备好,如下所示:

function loadWidget() {
    if($scope.post.provider === 'twitter') {
        $timeout(function() {
            if(angular.element('#post_' + $scope.post.id).find('iframe').length === 0) {
                twttr.widgets.createTweet($scope.post.twitter_id, document.getElementById('post_' + $scope.post.id)).then(function(resp) {
                    $timeout(function() {
                        $scope.loading = false;
                    })
                });
            };
        }, 2500);
    };
};

debugger如果我在我的块中插入一个,$timeout我可以看到它从 DOMangular.element('#post_' + $scope.post.id)返回一个有效值。div如果我访问我的帐户,我还可以确认我的推文在 Twitter 上。

这个设置已经运行了一段时间了。我没有对其进行任何更改。事实上,它在几个小时前还在工作!我想知道的是如何调试它并弄清楚它为什么突然停止工作。我检查了 Twitter API 的状态,它说它在过去 24 小时内有 100% 的正常运行时间。

更新

我设法在jsFiddle中重现了这个问题。据我所知,我用于测试的帐户中的推文似乎存在问题。正如您在 Fiddle 中看到的那样,我指定了两个 Tweet ID -tweetAtweetB- 然后将它们都嵌入。第一个是我的,无法加载。第二个加载就好了。

4

0 回答 0