2015-04-16 42 views
1

我試圖建立一個學習應用程序,目前它需要從一個subreddit獲得前7個職位,然後如果這還沒有在數據庫中,將其添加到數據庫。然而,由於某種原因,它會同時運行if和else 7次,我無法弄清楚原因。下面是輔助方法:流星獨特的文檔字段?

Template.posts.helpers({ 
    posts : function() { 
    Meteor.call('getPosts', "tifu", function(e, results){ 
     var result = JSON.parse(results.content).data.children; 
     Session.set('postsResults', result); 
    }); 
    for(var i=0; i<7; i++){ 
     var result = Session.get('postsResults')[i].data; 
     if(Posts.find({r_id: result.id}).count() == 0){ 
     console.log("if"); 
     } else {   
     console.log("else"); 
     }; 
    }; 
    return Posts.find(); 
    } 
}); 

和HTML端:

<template name="posts"> 
    <div class="col-md-12 posts-div"> 
     {{#each posts }} 
     <div class="col-md-8"> 
      <div class="panel panel-primary"> 
      <div class="panel-heading"> 
       <h3 class="panel-title">{{ title }}</h3> 
      </div> 
      <div class="panel-body">{{{ body }}}</div> 
      <div class="panel-footer"> 
       <div class="col-md-2">{{ score }}</div> 
       <div class="col-md-2 col-md-offset-3">{{ subreddit }}</div> 
       <div class="col-md-2 col-md-offset-3">{{ createdBy }}</div> 
       <div class="clearfix"></div> 
      </div> 
      </div> 
     </div> 
     <div class="col-md-4"> 
      <div class="panel panel-primary"> 
      </div> 
     </div> 
     {{/each}} 
    </div> 
    <hr> 
</template> 

我更換了簡單的控制檯日誌中插入代碼,這些都是結果我得到:

if 
if 
if 
if 
if 
if 
if 
else 
else 
else 
else 
else 
else 
else 

當我在控制檯中運行Posts.find({r_id: result.id}).count() == 0時,我得到的錯誤與Posts.findOne({r_id: result.id}) == null相同,但由於某種原因,在javascript文件中,它仍然運行真實部分,然後我得到了50份t他正是我想要避免的帖子。

+1

那麼,因爲幫助者運行異步,所以首先== 0它的真實,然後其他語句它的真正那就是你得到其他控制檯,例如鬆'console.log(Posts.find({r_id:result.id })。count())'在if語句中,你將在1秒內得到'0'和lester,你將得到另一個數字。 – Ethaan

回答

1

在助手中使用Meteor.call並不是最佳選擇。每當發生反應性變化時,幫手的function將重新運行。這就是它運行很多次的原因。

使用Template.onCreated回調,而不是:

Template.posts.onCreated(function() { 
    Meteor.call('getPosts', "tifu", function(e, results){ 
     var result = JSON.parse(results.content).data.children; 
     Session.set('postsResults', result); 
    }); 
}); 

而且你的幫手:

Template.posts.helpers({ 
    posts : function() { 
    var r = Session.get('postsResults') 

    for(var i=0; i<7; i++){ 
     if(!r) continue; 
     var result = r[i].data; 
     if(Posts.find({r_id: result.id}).count() == 0){ 
      console.log("if"); 
     } else {   
      console.log("else"); 
     }; 
     }; 
    return Posts.find(); 
    } 
}); 

第二件事要記住的是Session.get('postsResults')null而返回的Meteor.call的結果,幾百毫秒。如果你做Session.get('postsResults')[i].data你會得到一個例外。

這就是爲什麼我添加了條件檢查來繼續循環,如果r爲空。這樣,您就等待結果,並且將重新運行並使用新數據重新計算結果。