Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor订阅准备就绪,无法工作_Javascript_Meteor - Fatal编程技术网

Javascript Meteor订阅准备就绪,无法工作

Javascript Meteor订阅准备就绪,无法工作,javascript,meteor,Javascript,Meteor,我已经搜索和尝试了几个小时,但我找不出任何解决办法 我正在编写一个音乐应用程序,在服务器上播放YouTube上的歌曲。我正在下载缩略图并将其存储在一个文件夹中(因为我以后需要它的高斯模糊版本) 我的发布方法如下所示: Meteor.publish('currentSong', function() { return [Playlist.find({'position': 0}), Thumbnails.find()]; }); 我有一个版本只发布了当前歌曲的缩略图,但这导致了更多的问题

我已经搜索和尝试了几个小时,但我找不出任何解决办法

我正在编写一个音乐应用程序,在服务器上播放YouTube上的歌曲。我正在下载缩略图并将其存储在一个文件夹中(因为我以后需要它的高斯模糊版本)

我的发布方法如下所示:

Meteor.publish('currentSong', function() {
    return [Playlist.find({'position': 0}), Thumbnails.find()];
});
我有一个版本只发布了当前歌曲的缩略图,但这导致了更多的问题

在我的TemplatesOnCreated方法中,我订阅了它(以及其他各种东西)。我在
this.autorun()
方法内部和外部都尝试过

Template.controlpanel.onCreated(function() {
    // subscribe to the publications
    Meteor.subscribe('currentSong');
    Meteor.subscribe('status');
});
然后,我有一个模板帮助器,它检索缩略图的URL,以便在
“/>
上下文中实际显示它:

getThumbnail: function() {
    if(Template.instance().subscriptionsReady()){
        var thumbnail = this.thumbnail.getFileRecord();
        if(!$.isEmptyObject(thumbnail)){
            return thumbnail.url({'store': 'Thumbnail'});
        }
    }
}
因为我被要求提供更多的代码,这里是一个来自实际模板的片段

{{#with currentSong}}
<div id="ThumbnailDisplay">     
    <img src="{{getThumbnail}}" alt="{{title}} Thumbnail" id="thumbnail">
</div>
{{/with}}
在这里您可以看到,
this.thumbnail
{{with currentSong}}}
的上下文中是指存储缩略图及其高斯模糊版本的FS.File对象

问题是,当模板已经加载并且正在从一首歌曲切换到另一首歌曲时,它可以正常工作。但是当我的播放列表中没有歌曲时,显示部分是不可见的(从技术上讲,模板是渲染的,但所有信息都在
{with currentSong}
块中)。当我插入一首歌曲时,屏幕会“弹出”,除缩略图外,所有内容都会显示出来(歌曲标题、持续时间滑块等)。一旦我重新加载页面,它就会出现

我正在订阅收藏。我检查订阅是否已准备就绪,但它仍然不起作用

我的应用程序中还有一些其他部分,我在一个onCreated上下文中订阅,但仍然必须使用setTimeout
(function(),100)
,因为否则数据还不可用

我很确定问题就在屏幕前,我遗漏了一些东西,或者不完全理解Meteor的订阅,以及哪部分是反应性的或不是。但我就是不明白。如果你能帮我,我将不胜感激


需要注意的一点是,我知道它的功能。我在我的另一个项目中使用过它。但是这个应用程序是唯一一个完全不需要路由的单页应用程序。所以我想限制使用它。

所以在玩了一点之后,问题基本上是,订阅已经准备好了,但是收集nFS文件不可用

现在,我的解决方案是,让我的助手以反应式的方式设置正确的URL,除了第一次呈现模板外,URL始终有效

为了解决这个问题,我有一个自动运行功能,它可以在歌曲改变时改变图像

this.autorun(function() {
    if(this.subscriptionsReady()){
        var currentSong = Playlist.findOne({'position': 0});
        if(currentSong ){
            var thumbnail = currentSong.thumbnail.getFileRecord();
            $('#thumbnail').attr('src', thumbnail.url());
        }
    }
}.bind(this));

这可能不是理想的解决方案,但确实有效。出于某些原因,subscriptionReady和CollectionFS似乎不能很好地协同工作。

您可能需要为我们展示更多的代码来发现问题。特别是您如何从将两个不同的游标以数组形式发布到此。Thumbnail我已编辑了问题,以便为您提供更多代码。我希望这会有所帮助。您认为发布的哪一部分很奇怪?正确的方法是什么?您在控制台中是否遇到任何错误?有时,在这些情况下,我发现客户端由于e而停止处理错误,因为变量未定义-例如,在调用getFileRecord()时,this.缩略图可能未定义。我刚刚再次检查,没有,我没有看到任何错误消息。但我尝试将
console.log(thumbnail.url({'store':'thumnail'}))
放在帮助程序中,当我输入第一首歌曲时(这会导致模板“出现”),第一条消息为我提供了正确的URL,但随后我看到了连续的消息,声明由同一个助手产生的
null
。这似乎很奇怪。因此我实际上找到了一个我根本不喜欢的黑客解决方案。使用一些
console.log()
语句我发现,在某个点上,助手实际上找到了缩略图,但是
缩略图.url()
返回空值的值不小于空值。但是如果我将此
返回缩略图.url()
放在
setTimeout(函数(){…},100)中
阻止它工作。所以我的问题是,为什么会有类似于
subscriptionsReady()
的东西,而最终,订阅还没有准备好。这个函数甚至在数据找不到的情况下返回true。这将是我在这个项目中第三次不得不使用
setTimeout
hack。
this.autorun(function() {
    if(this.subscriptionsReady()){
        var currentSong = Playlist.findOne({'position': 0});
        if(currentSong ){
            var thumbnail = currentSong.thumbnail.getFileRecord();
            $('#thumbnail').attr('src', thumbnail.url());
        }
    }
}.bind(this));