我使用 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 -tweetA
和tweetB
- 然后将它们都嵌入。第一个是我的,无法加载。第二个加载就好了。